如何解决SQL Server-获取以逗号分隔的具有值的列名
|Customer Id| Attr1 | Attr2 | Attr3 | Attr4 | Attr5 | Attr6 |
|1 | 1 | 0 | 0 | 1 | 0 | 1 |
|2 | 1 | 0 | 1 | 0 | 0 | 0 |
|3 | 0 | 1 | 0 | 1 | 1 | 0 |
|Customer Id| Vals |
|1 | Attr1,Attr4,Attr6 |
|2 | Attr1,Attr3 |
|3 | Attr2,Attr5 |
注意:列名是已知的,我不寻找动态查询。还查询sql Server 2012
解决方法
一种方法是使用CONCAT_WS
和一些CASE
表达式:
SELECT YT.CustomerID,CONCAT_WS(',',CASE Attr1 WHEN 1 THEN 'Attr1' END,CASE Attr2 WHEN 1 THEN 'Attr2' END,CASE Attr3 WHEN 1 THEN 'Attr3' END,CASE Attr4 WHEN 1 THEN 'Attr4' END,CASE Attr5 WHEN 1 THEN 'Attr5' END,CASE Attr6 WHEN 1 THEN 'Attr6' END) AS Vals
FROM dbo.YourTable;
似乎OP没有使用SQL Server的最新版本,因此他们将需要在STUFF
上使用更旧的方法:
SELECT YT.CustomerID,STUFF(CONCAT(',' + CASE Attr1 WHEN 1 THEN 'Attr1' END,' + CASE Attr2 WHEN 1 THEN 'Attr2' END,' + CASE Attr3 WHEN 1 THEN 'Attr3' END,' + CASE Attr4 WHEN 1 THEN 'Attr4' END,' + CASE Attr5 WHEN 1 THEN 'Attr5' END,' + CASE Attr6 WHEN 1 THEN 'Attr6' END),1,'') AS Vals
FROM dbo.YourTable;
,
您可以使用:
select YT.CustomerId,stuff( (case when attr1 = 1 then ',Attr1' else '' end) +
(case when attr1 = 2 then ',Attr2' else '' end) +
(case when attr1 = 3 then ',Attr3' else '' end) +
(case when attr1 = 4 then ',Attr4' else '' end) +
(case when attr1 = 5 then ',Attr5' else '' end) +
(case when attr1 = 6 then ',Attr6' else '' end),2,''
)
from t;
SQL Server的最新版本支持concat_ws()
,在这种情况下非常方便。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。