2015-07-28 5 views
2

Я пытаюсь открутить некоторые данные, и я думаю, что мне нужно включить оператор case в мой сводный код, но я не уверен, как это сделать. У меня есть ниже таблице:SQL Server pivot using case statement

ID  AreaCode 
1001 1501 
1001 1502 
1001 2301 
1031 1010 
1031 3012 
1048 2304 
1048 3012 
1048 4022 

Первая цифра каждого AREACODE относится к области тела, я использую ниже код, чтобы указать, какая область тела влияет:

select id, 
case when left(areaID,1)=1 then 'Yes' end Head, 
case when left(areaID,1)=2 then 'Yes' end Face, 
case when left(areaID,1)=3 then 'Yes' end Neck, 
case when left(areaID,1)=4 then 'Yes' end Abdo 
from #testcase 

Который дает мне следующее:

id  Head Face Neck Abdo 
1001 Yes  NULL NULL NULL 
1001 Yes  NULL NULL NULL 
1001 NULL Yes  NULL NULL 
1031 Yes  NULL NULL NULL 
1031 NULL NULL Yes  NULL 
1048 NULL Yes  NULL NULL 
1048 NULL NULL Yes  NULL 
1048 NULL NULL NULL Yes 

Однако, мне нужен мой выходной таблицы содержит одну строку для каждого идентификатора, например, так:

id  Head Face Neck Abdo 
1001 Yes  Yes  Null Null 
1031 Yes  Null Yes  Null 
1048 Null Yes  Yes  Yes 

Можете ли я включить заявление о моем случае в центр, чтобы достичь этого? Благодаря

ответ

1

Вы должны использовать aggregate на вершине case заявления

SELECT id, 
     Max(CASE 
      WHEN LEFT(areaID, 1) = 1 THEN 'Yes' 
      END) Head, 
     Max(CASE 
      WHEN LEFT(areaID, 1) = 2 THEN 'Yes' 
      END) Face, 
     Max(CASE 
      WHEN LEFT(areaID, 1) = 3 THEN 'Yes' 
      END) Neck, 
     Max(CASE 
      WHEN LEFT(areaID, 1) = 4 THEN 'Yes' 
      END) Abdo 
FROM #testcase 
GROUP BY id 
+0

Отлично, спасибо – GullitsMullet

2

Вы можете использовать реальное PIVOT решение вместо вроде этого:

DECLARE @t table(ID int, AreaCode int) 
INSERT @t 
VALUES 
    (1001,1501),(1001,1502),(1001,2301),(1031,1010), 
    (1031,3012),(1048,2304),(1048,3012),(1048,4022) 

SELECT id, [1]Head, [2]Face, [3]Neck, [4]Abdo 
FROM 
( 
    SELECT id, left(AreaCode, 1) Area, 'Yes' x 
    FROM @t 
) p 
PIVOT (Max(x) FOR [Area] IN ([1],[2],[3],[4])) AS pvt 

Результат:

id Head Face Neck Abdo 
1001 Yes Yes NULL NULL 
1031 Yes NULL Yes NULL 
1048 NULL Yes Yes Yes 
+0

Спасибо, сохранили это для следующего раза мне нужно Piv ot :) – GullitsMullet