У меня есть эта таблица ниже. Давайте просто назовем это телефоном

--------------------------
| userid | type | number |
--------------------------
| 1      | home | 123456 |
--------------------------
| 1      |office| 654321 |
--------------------------

Поэтому я хочу, чтобы это было так:

--------------------------
| userid | home | office |
--------------------------
| 1      |123456| 654321 |
--------------------------

Я пробую сводную таблицу, но проблема в том, что у меня нет поля для агрегирования. Любое предложение?

PS Я использую Azure SQL Server

0
Francis 28 Май 2017 в 12:18

2 ответа

Лучший ответ

Одним из способов является:

with your_table( userid , type , number) as (
    select 1      ,'home','123456' union all
    select 1      ,'office','654321' union all
    select 2      ,'home','4444' union all
    select 3      ,'office','77777'  
)

-- below is actual query:

select coalesce(t1.userid, t2.userid) as userid, t1.home, t2.office from
(select userid, number as home from your_table where type = 'home') t1
full join 
(select userid, number as office from your_table where type = 'office' ) t2
on t1.userid = t2.userid

Если у вас есть другие значения в столбце type, и вам нужно отобразить их как столбцы, то вам следует добавить еще один подзапрос и full join.

1
Oto Shavadze 28 Май 2017 в 09:50

Если у вас нет повторяющихся значений:

select 
    user_id,
    min(case when type='home' then type else null end) home,
    min(case when type='office' then type else null end) office
from
    phone
group by
    userid;
0
nabeel 28 Май 2017 в 10:08