sql-server - 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 的方法,但无法实现 . 有什么帮助吗?
解决方案
你需要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
为''
字符串位置的开头。
推荐阅读
- angular - Angular 中动态编译的延迟加载动态路由导致“不安全评估”错误
- javascript - 如何在 MTableToolbar 上应用 disableGutters 道具?
- mysql - MySQL 意外关闭。这可能是由于端口被阻塞、缺少依赖项、权限不正确、崩溃或被其他方法关闭所致
- reactjs - 测试套件无法运行 TypeError:无法读取未定义的属性“hasOwnProperty”
- android - MVVM 如何更新不包含视图模型的行?
- r - R Mlogit 替换行中的错误,无法将选择变量强制为逻辑
- python - Python numpy.linalg.inv() 在由 numpy.cov() 创建的矩阵上返回废话。帮我解决这个奇怪的错误
- git - 警告:CRLF 将被 Ubuntu 上的 LF 问题取代
- vba - 如何使用 Word VBA 宏在列标题下方添加一行并向下移动现有行?
- react-native - 如何在本机反应中为标签栏制作可重用组件