如何通过SQL将同一SubNo的多行数据合并为单行?
问题描述
现有[dbo].[Core]表,SubNo是自定义关联ID,同批次插入的记录共享同一个SubNo。当前执行的SQL查询返回多行结构数据,需要将同一SubNo的记录按FID(YourName、YourDate、YourTime)转换为单行输出,试过JOIN和STRING_AGG方法都没成功。
原表结构
| SubNo | Type | FID | FVal |
|---|---|---|---|
| 2173 | SOS | YourName | J Bloggs |
| 2173 | SOS | YourDate | 2023-10-30 |
| 2173 | SOS | YourTime | 07:30 |
| 2174 | SOS | YourName | N.E Body |
| 2174 | SOS | YourDate | 2023-10-31 |
| 2174 | SOS | YourTime | 09:00 |
期望输出
| SubNo | Type | YourName | YourDate | YourTime |
|---|---|---|---|---|
| 2173 | SOS | J Bloggs | 2023-10-30 | 07:30 |
| 2174 | SOS | N.E Body | 2023-10-31 | 09:00 |
当前查询语句
SELECT * FROM [dbo].[Core] WHERE Type = 'SOS' AND FID IN ('YourName','YourDate','YourTime') ORDER BY SubNo DESC OFFSET 0 ROWS FETCH FIRST 2 ROWS ONLY
解决方案
这里推荐两种行转列的常用方法,都能实现你的需求:
方法1:条件聚合(兼容性强)
这种写法适配绝大多数SQL Server版本,逻辑清晰:
SELECT SubNo, Type, MAX(CASE WHEN FID = 'YourName' THEN FVal END) AS YourName, MAX(CASE WHEN FID = 'YourDate' THEN FVal END) AS YourDate, MAX(CASE WHEN FID = 'YourTime' THEN FVal END) AS YourTime FROM [dbo].[Core] WHERE Type = 'SOS' AND FID IN ('YourName','YourDate','YourTime') GROUP BY SubNo, Type ORDER BY SubNo DESC OFFSET 0 ROWS FETCH FIRST 2 ROWS ONLY;
通过CASE语句匹配每个FID对应的FVal,再用MAX聚合(因为同一SubNo+Type+FID只会有一条记录,用MIN也可以),把多行数据合并成单行。
方法2:使用PIVOT运算符(写法简洁)
SQL Server支持PIVOT语法,专门用来处理行转列场景:
SELECT SubNo, Type, YourName, YourDate, YourTime FROM ( SELECT SubNo, Type, FID, FVal FROM [dbo].[Core] WHERE Type = 'SOS' AND FID IN ('YourName','YourDate','YourTime') ) AS SourceTable PIVOT ( MAX(FVal) FOR FID IN (YourName, YourDate, YourTime) ) AS PivotTable ORDER BY SubNo DESC OFFSET 0 ROWS FETCH FIRST 2 ROWS ONLY;
先通过子查询筛选出需要的数据,再用PIVOT把FID的取值转成列,聚合函数MAX用来确保每个分组下的对应列只取唯一值。
内容的提问来源于stack exchange,提问作者darkfury
相关产品推荐
相关产品推荐

