如何使用PIVOT改写SQL查询,将结果展示为单行?
使用PIVOT改写SQL查询实现单行展示
没问题,我来帮你把这段SQL改写成用PIVOT的版本,这样就能把不同交易类型的金额都整合到同一行里,正好符合你的需求。
先理下原查询的逻辑:你通过CTE T1获取基础数据,T2按SId和TransType分组汇总金额,最后关联Master表用CASE语句生成对应类型的金额列。但原写法会因为TransType的不同产生多行记录,而PIVOT可以直接把行转列,一次性得到单行结果。
改写后的完整SQL如下:
WITH T1 AS ( -- 保留你原有的EXT Code逻辑 EXT Code ), T2 AS ( SELECT p.SId, p.TransType, Amount = SUM(p.Amount) FROM T1 p GROUP BY p.SId, p.TransType ) SELECT m.SNo, m.Name, -- 给PIVOT生成的列指定你需要的别名 [PAYCM] AS 'GROSS CM', [PAYYTD] AS 'GROSS YTD', [TAXCM] AS 'Tax CM', [TAXYTD] AS 'Tax YTD' FROM Master m INNER JOIN ( -- 对T2的分组结果进行PIVOT转换 SELECT SId, TransType, Amount FROM T2 ) t ON t.SId = m.Id -- 注:原查询写的是t.PId = m.Id,这里按T2的字段调整为SId,若实际是PId可自行替换 PIVOT ( SUM(Amount) -- 指定需要转成列的交易类型值 FOR TransType IN ([PAYCM], [PAYYTD], [TAXCM], [TAXYTD]) ) AS PivotTable;
关键说明:
PIVOT子句中,SUM(Amount)指定了要聚合的数值字段,FOR TransType IN (...)列出了需要转成列的交易类型值,这些值必须用方括号包裹(避免语法冲突)。- 我们将PIVOT转换后的结果与
Master表关联,既能拿到SNo和Name,又能把转成列的金额字段重命名成你需要的格式。 - 如果原查询的关联条件
t.PId = m.Id不是笔误,你只需要把T2中的SId替换为PId即可保持逻辑一致。
这样改写后,每个SNo和Name都会对应唯一一行记录,四个金额列全部展示在同一行里,完全满足你的需求。
内容的提问来源于stack exchange,提问作者M Cham
相关产品推荐
相关产品推荐

