请帮助,我有一张这样的表:
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
谢谢!
答案 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。