存储过程中临时表按DESCR分组,合并CHG与LATEFEE值的方法
问题描述
我正在开发一个存储过程,需要修改临时表以根据特定条件输出数据。该存储过程较为复杂,包含约40列,但当前需求仅需按DESCR列对记录分组,其余37列值均一致,不会造成问题。请问如何按DESCR分组并合并CHG和LATEFEE的值?
当前查询大致如下:
SELECT [columns1], [column38], t.descr, t.chg, t.lateFee, (t.chg + t.lateFee) as Total FROM #tmpStatement t INNER JOIN dbo.Association a ON t.AssocID = a.AssocID INNER JOIN dbo.Company c ON a.CompanyID = c.CompanyID GROUP BY [all columns]
若从GROUP BY子句中移除t.chg或t.lateFee列,SQL会提示这些列在SELECT列表中无效,因未包含在GROUP BY中,但我仍需保留这些列的合并后的值。
当前表输出结果:
DESCR CHG LATEFEE TOTAL ================================= Assessment 1 0 1 Spec 0 2 2 Spec 3 0 3 Assessment 0 5 5 Res 3 0 3
期望得到的结果:
DESCR CHG LATEFEE TOTAL ================================= Assessment 1 5 6 Spec 3 2 5 Res 3 0 3
解决方案
要实现按DESCR分组并合并CHG和LATEFEE的值,核心是对这两列使用聚合函数求和,同时处理好其余37列的分组逻辑:
修改后的查询示例如下:
SELECT -- 替换为实际的37列名,或用MAX()包裹(因列值一致,结果不受影响) [column1], [column2], ..., [column38], t.descr, SUM(t.chg) AS CHG, SUM(t.lateFee) AS LATEFEE, SUM(t.chg + t.lateFee) AS Total FROM #tmpStatement t INNER JOIN dbo.Association a ON t.AssocID = a.AssocID INNER JOIN dbo.Company c ON a.CompanyID = c.CompanyID GROUP BY [column1], [column2], ..., [column38], t.descr
关键说明
- 聚合函数求和:
SUM(t.chg)和SUM(t.lateFee)会自动将同一DESCR分组下的对应列值累加,正好满足合并需求。 - GROUP BY处理:由于其余37列值完全一致,将它们加入
GROUP BY子句不会破坏分组逻辑,同时能避免SQL报错。如果列太多不想逐个罗列,也可以对这些列使用MAX()(如MAX([column1]) AS column1),此时GROUP BY只需保留t.descr即可——因为列值相同,MAX()的结果和原值完全一致。 - Total列计算:
SUM(t.chg + t.lateFee)与SUM(t.chg) + SUM(t.lateFee)结果等价,可任选一种写法。
内容的提问来源于stack exchange,提问作者user7496931
相关产品推荐
相关产品推荐

