首页 > 解决方案 > SQL SERVER 将行转换为列

问题描述

我的输入为

123   1    Y    Active

123   1    Y    Idle

109   1    Y    Active

109   1    Y    Away

165   1    Y    Active

145   1    Y    Idle

我需要输出为:

123  1  Y   Active and Idle

109  1  Y   Active and Away

165  1  Y   Active Only

145  1  Y   Idle Only

SELECT distinct COl1,Col2,Col3 ,
case when Col4 = 'Active' and Col4 = 'Idle' then 'Active and Idle'
when Col4 = 'Active' and Col4 = 'Away' then 'Active and Away'
when Col4 = 'Active' then  'Active Only'
when Col4 = 'Idle' then  'Idle Only'

end  as category
from Person

我尝试了上面的查询,但它不起作用并且它不会起作用,因为我试图将多行转换为 1 列,这在 Case 中是不可能的。

我必须尝试类似 PIVOT 的方法,但无法实现 . 有什么帮助吗?

标签: sql-server

解决方案


你需要FOR XML PATH()的方法:

SELECT DISTINCT p.col1, STUFF(pp.Col4, 1, 4, '') AS category
FRPM Person p CROSS APPLY
     ( SELECT ' AND ' + p1.Col4 
       FROM Person p1
       WHERE P1.col1 = p.col1 
       FOR XML PATH('')
     ) pp(Col4);

通过这种方式FOR XML PATH(''),将为每个col1& 外部查询返回 xml 元素,STUFF()并将替换AND''字符串位置的开头。


推荐阅读