You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL将同一SubNo的多行数据合并为单行?

问题描述

现有[dbo].[Core]表,SubNo是自定义关联ID,同批次插入的记录共享同一个SubNo。当前执行的SQL查询返回多行结构数据,需要将同一SubNo的记录按FID(YourName、YourDate、YourTime)转换为单行输出,试过JOIN和STRING_AGG方法都没成功。

原表结构

SubNoTypeFIDFVal
2173SOSYourNameJ Bloggs
2173SOSYourDate2023-10-30
2173SOSYourTime07:30
2174SOSYourNameN.E Body
2174SOSYourDate2023-10-31
2174SOSYourTime09:00

期望输出

SubNoTypeYourNameYourDateYourTime
2173SOSJ Bloggs2023-10-3007:30
2174SOSN.E Body2023-10-3109: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:57:39