使用case语句

时间:2015-07-28 09:07:02

标签: sql-server pivot

我试图隐藏一些数据,我想我需要在我的透视代码中加入一个case语句,但我不确定如何。我有下表:

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包含一行,如下所示:

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

可以将我的case语句合并到一个数据透视中来实现这一目标吗?感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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