2016-04-27 6 views
0

У меня есть таблица, которая содержит пользователей, там номера телефонов и тип телефонаПреобразование строк в столбцы с помощью в SQL Server

Таблица PersonPhone:

ID  UserID  PhoneType Phone 
----- -------  ----  ------ 
1  101   1   # 
2  101   2   # 
3  102   1   # 
4  102   3   # 
5  103   1   # 
6  103   2   # 
7  103   3   # 
8  104   1   # 
9  104   3   # 
10 104   3   # 

Я пытаюсь создать отборное заявление который имеет результирующий набор, аналогичный приведенному ниже:

ID   PhoneType1 PhoneType2 PhoneType3 
-------  ----  ------  ------ 
101   #  #  # 
102   #  #  # 
103   #  #  # 
104   #  #  # 

Есть ли все равно для этого? Я пробовал:

SELECT PersonID 
, ISNULL(MAX(CASE phoneTypeId WHEN '2' THEN phone ELSE 0 END), 0) AS 'TYPE1'   
, ISNULL(MAX(CASE phoneTypeId WHEN '3' THEN phone ELSE 0 END), 0) AS 'TYPE2'  
, ISNULL(MAX(CASE phoneTypeId WHEN '5' THEN phone ELSE 0 END), 0) AS 'TYPE3' 
FROM personPhone 
GROUP BY personId 
+0

Какой тип данных вы храните в качестве номера телефона? –

+1

Возможный дубликат [SQL Server: Транспонирование строк в столбцы] (http://stackoverflow.com/questions/20111418/sql-server-transpose-rows-to-columns) – rll

+0

@rll - Это определенно обман. Человек, который разместил это, должен взглянуть на ответы в этом вопросе. – Dresden

ответ

0
WITH p_cte AS (
    SELECT 
    UserID 
    , AggregateBy = Phone 
    , [Spread] = 'PhoneType' + PhoneType 
    FROM 
    PersonPhone 
) 
SELECT 
    * 
FROM 
    p_cte 
PIVOT (MAX(AggregateBy) FOR [Spread] IN (PhoneType1, PhoneType2, PhoneType3)) pvt; 
0

Есть несколько способов сделать это, два из которых были бы использовать подзапросы, или же вы можете сделать, чтобы присоединиться к одной и той же таблице.

подзапросов:

select UserId, 
    (select Phone from PersonPhone p2 where p2.UserId = p1.UserId and p2.PhoneType = 1) as PhoneType1, 
    (select Phone from PersonPhone p2 where p2.UserId = p1.UserId and p2.PhoneType = 2) as PhoneType3, 
    (select Phone from PersonPhone p2 where p2.UserId = p1.UserId and p2.PhoneType = 3) as PhoneType3 
from PersonPhone p1; 

Или с помощью присоединиться:

select p.UserId, p1.Phone as PhoneType1, p2.Phone as PhoneType2, p3.Phone as PhoneType3 
from PersonPhone p 
left join PersonPhone p1 
on p1.UserId = p.UserId and p1.PhoneType = 1 
left join PersonPhone p3 
on p2.UserId = p.UserId and p2.PhoneType = 2 
left join PersonPhone p3 
on p2.UserId = p.UserId and p3.PhoneType = 3; 

Третий вариант был бы группой на UserId и использовать CASE заявление:

select UserId, 
    case when PhoneType = 1 then Phone end as PhoneType1, 
    case when PhoneType = 2 then Phone end as PhoneType2, 
    case when PhoneType = 3 then Phone end as PhoneType3 
from PersonPhone 
group by UserId; 

Я DON» t иметь доступ к установке sql на данный момент, чтобы проверить их, но они должны все работа хорошо.

0
SELECT 
PERSONID 
,COALESCE(MAX(CASE WHEN phoneTypeId = '3' THEN SUBSTRING(Phone,1,12) END), '') as 'TYPE1' 
,COALESCE(MAX(CASE WHEN phoneTypeId = '2' THEN SUBSTRING(Phone,1,12) END), '') as 'TYPE2' 
,COALESCE(MAX(CASE WHEN phoneTypeId = '5' THEN SUBSTRING(Phone,1,12) END), '') as 'TYPE3' 
FROM personphone 
WHERE len(phone) = 12 
GROUP BY personid 
order by personid 
Смежные вопросы