如何在SQL中对ID与Alt_ID关联行的Quantity求和?
解决SQL中跨列匹配的多行求和问题
要实现你需要的求和逻辑,核心是先统计所有通过Alt_ID指向某个ID的行的数量总和,再将这个总和与被指向的ID行自身的Quantity相加。以下是具体实现方案:
实现查询
使用CTE(公共表表达式)先计算每个ID被其他行的Alt_ID引用的总数量,再关联原表计算最终的Total:
WITH ReferencedTotals AS ( SELECT Alt_ID AS Target_ID, SUM(Quantity) AS TotalReferenced FROM dbo.Table WHERE Alt_ID IS NOT NULL AND Alt_ID <> '' GROUP BY Alt_ID ) SELECT t.ID, t.Alt_ID, t.Quantity, CASE -- 被其他行引用的ID,总和为自身数量加所有引用行的数量 WHEN rt.Target_ID IS NOT NULL THEN t.Quantity + rt.TotalReferenced -- 引用其他ID的行,总和为自身数量 WHEN t.Alt_ID IS NOT NULL AND t.Alt_ID <> '' THEN t.Quantity -- 无关联的行,总和为自身数量 ELSE t.Quantity END AS Total FROM dbo.Table t LEFT JOIN ReferencedTotals rt ON t.ID = rt.Target_ID;
原查询问题分析
你当前的查询存在两个关键问题:
- 窗口函数分区错误:
SUM(Total_Usage) OVER (PARTITION BY T1.ID, T1.Alt_ID)会将每个ID+Alt_ID组合单独分区,对于ID='00-456'的行,分区仅包含它自己,所以求和结果只能是自身的Quantity。 - 逻辑覆盖不全:没有将
Alt_ID指向当前ID的行的数量纳入求和范围,且代码中Total_Usage应为Quantity(原表列名是Quantity)。
测试结果
执行上述查询后,会得到你预期的结果:
| ID | Alt_ID | Quantity | Total |
|---|---|---|---|
| 00-123 | 00-456 | 10 | 10 |
| 00-456 | NULL | 5 | 15 |
内容的提问来源于stack exchange,提问作者akroeker
相关产品推荐
相关产品推荐

