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

基于多列分组并将行值转列的T-SQL实现问题

解决方案:行转列并确保固定列存在

你需要的是**行转列(Pivot)**的实现,而且要强制保留三个固定的FaultTypeName列,哪怕对应分组下没有该类型的数据也要填充0。之前用row_number()没成功,是因为这个函数的作用是给分组内的行分配序号,没法直接实现列的转换和缺失值填充。

核心思路:条件聚合

最直接的方式是用条件聚合(CASE WHEN 配合聚合函数),针对每个固定的FaultTypeName创建单独的列,同时处理缺失值填充0的需求:

SELECT
    MeasurementId,
    RoomType,
    -- 为每个固定故障类型生成列,无数据则填0
    MAX(CASE WHEN FaultTypeName = 'Methode (M)' THEN Result ELSE 0 END) AS [Methode (M)],
    MAX(CASE WHEN FaultTypeName = 'Periodiek (P)' THEN Result ELSE 0 END) AS [Periodiek (P)],
    MAX(CASE WHEN FaultTypeName = 'Vuil (V)' THEN Result ELSE 0 END) AS [Vuil (V)]
FROM vwReportData
WHERE measurementid = 1382596
GROUP BY MeasurementId, RoomType;

代码说明

  1. 分组逻辑:通过GROUP BY MeasurementId, RoomType,把同一房间类型、同一测量ID的行合并成一行
  2. 条件列生成:每个CASE WHEN语句会筛选出对应FaultTypeName的Result值,没有匹配的行就返回0
  3. 聚合函数选择:这里用MAX是假设每个RoomType + FaultTypeName组合只有一个Result值;如果存在多个值,你可以根据需求换成SUM(求和)、AVG(平均值)等

为什么不用PIVOT?

SQL的PIVOT语法也能实现行转列,但它默认只会保留查询结果中存在的FaultTypeName值作为列——如果某个分组下缺少其中一两个类型,对应的列就会消失。而条件聚合的方式能强制保留三个固定列,更符合你的需求。

关于你之前的row_number()尝试

row_number()在这里的作用是给每个RoomType分组内的行按FaultTypeName排序编号,但它并没有改变数据的行结构,所以没法实现你需要的“把不同故障类型转成列”的效果,因此需要换成聚合+条件判断的思路。

内容的提问来源于stack exchange,提问作者Nicolas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:57:40