T-SQL多列Pivot操作出现重复结果问题
哈哈,这种多列Pivot后行数爆炸的坑我踩过好多次!核心问题大概率是你没把两个聚合列的Pivot逻辑合并到同一个分组维度下,导致数据库把RequestCount和ResponseCount的Pivot当成了独立的分组操作,最终产生了类似笛卡尔积的额外行。
给你两个最常用的解决方案,适配绝大多数SQL数据库:
方案1:用CASE WHEN手动实现多列Pivot(最通用)
这种方法不需要依赖数据库的PIVOT关键字,兼容性拉满,而且逻辑清晰,不容易出错。假设你的聚合表结构是Unit#, Category, RequestCount, ResponseCount(已经按Unit#和Category聚合过),可以这么写:
SELECT Unit#, -- 按Category拆分RequestCount MAX(CASE WHEN Category = '类别1' THEN RequestCount END) AS Request_类别1, MAX(CASE WHEN Category = '类别2' THEN RequestCount END) AS Request_类别2, -- 按同样的Category拆分ResponseCount MAX(CASE WHEN Category = '类别1' THEN ResponseCount END) AS Response_类别1, MAX(CASE WHEN Category = '类别2' THEN ResponseCount END) AS Response_类别2 -- 其他类别以此类推 FROM YourAggregatedTable GROUP BY Unit# -- 只按Unit#分组,确保每个Unit#一行
方案2:先Unpivot再Pivot(适合类别较多的场景)
如果你的Category值很多,手动写CASE WHEN太麻烦,可以先把RequestCount和ResponseCount转成键值对,再统一Pivot:
WITH UnpivotedData AS ( SELECT Unit#, -- 把聚合列和Category拼接成新的Pivot列名 CONCAT(Category, '_Request') AS PivotCol, RequestCount AS Value FROM YourAggregatedTable UNION ALL SELECT Unit#, CONCAT(Category, '_Response') AS PivotCol, ResponseCount AS Value FROM YourAggregatedTable ) SELECT Unit#, -- 列出所有需要的Pivot列 类别1_Request, 类别1_Response, 类别2_Request, 类别2_Response FROM UnpivotedData PIVOT ( MAX(Value) FOR PivotCol IN ( 类别1_Request, 类别1_Response, 类别2_Request, 类别2_Response ) ) AS PivotedResult
最后排查一下前置问题
如果上面的方法还是不行,先检查你的聚合表是不是存在重复的Unit# + Category组合?比如执行下面的SQL看看:
SELECT Unit#, Category, COUNT(*) AS RowCount FROM YourAggregatedTable GROUP BY Unit#, Category HAVING COUNT(*) > 1
如果有结果,说明你的聚合粒度不对,得先重新把数据聚合到Unit# + Category的唯一级别,再做Pivot操作。
内容的提问来源于stack exchange,提问作者user2122092
相关产品推荐
相关产品推荐

