SQL - Coulmn标题为行(对于0和1)

时间:2017-11-14 21:50:45

标签: sql

请帮助,我有一张这样的表:

ID  HCC1    HCC2    HCC3    HCC4
101 0   1   1   0
102 0   0   1   0
103 0   0   0   0

我希望结果表看起来像这样:

ID  HCC
101 HCC2
101 HCC3
102 HCC3
103 0

如果一个成员在多个HCC中有1个,则两个都需要在单独的行中列出(例如ID-101)。如果成员在所有HCC中都为0,则HCC列中应该为0(例如ID-103)。我试过“unpivot”,但它只适用于1,我也需要0。

我有150个这样的列标题和100,000个ID

谢谢!

2 个答案:

答案 0 :(得分:2)

一种方法使用union all

select id, 'HCC1' as hcc from t where hcc1 = 1 union all
select id, 'HCC2' as hcc from t where hcc2 = 1 union all
select id, 'HCC3' as hcc from t where hcc3 = 1 union all
select id, 'HCC4' as hcc from t where hcc4 = 1 union all
select id, '0' as hcc from t where hcc1 = 0 and hcc2 = 0 and hcc3 = 0 and hcc4 = 0;

这是标准的SQL。特定数据库可能有其他方法或捷径。

答案 1 :(得分:1)

如果dbms是MS SQL Server(或者可能是支持“apply运算符”且允许values的其他平台),则仅适用。可以构建一个脚本来生成~150个案例表达式(或使用Excel),但这里的优点是只有一个遍历源表。

DEMO MS SQL Server

CREATE TABLE Table1
    ([ID] int, [HCC1] int, [HCC2] int, [HCC3] int, [HCC4] int)
;

INSERT INTO Table1
    ([ID], [HCC1], [HCC2], [HCC3], [HCC4])
VALUES
    (101, 0, 1, 1, 0),
    (102, 0, 0, 1, 0),
    (103, 0, 0, 0, 0)
;

查询1

SELECT 
      id, ca.HCC
FROM table1
CROSS APPLY (
  values
       (case when HCC1+HCC2+HCC3+HCC4 = 0 then '0' end)
     , (case when HCC1 = 1 then 'HCC1' end)
     , (case when HCC2 = 1 then 'HCC2' end)
     , (case when HCC3 = 1 then 'HCC3' end)
   ) ca(HCC)
WHERE ca.hcc IS NOT NULL

<强> Results

|  id |  HCC |
|-----|------|
| 101 | HCC2 |
| 101 | HCC3 |
| 102 | HCC3 |
| 103 |    0 |

如果没有别的,也许这个dbms特定的答案会提示你添加实际使用的dbms。