在SQL Server Management Studio中如何对CASE语句内的两行数据求和
解决方案
核心思路
你现在返回的两行价格是因为同一个单据ID对应了两个物料清单条目,要合并求和只需要做两步:
- 先把CASE返回的字符串格式价格统一转换为数值类型(注意处理德式格式的逗号小数点)
- 用
SUM()聚合函数按单据IDBelID分组,即可得到合并后的总价格
原有逻辑潜在问题提示
你现有代码第二个WHEN条件中的(KHKVKBelegePositionen.Artikelgruppe != '181' OR KHKVKBelegePositionen.Artikelgruppe != '182' OR KHKVKBelegePositionen.Artikelgruppe != '183')逻辑永远成立,无论物料组是什么值都会满足该条件,推测你实际需要的是「物料组不在181/182/183范围内」的逻辑,下面的代码已经用更简洁的NOT IN做了修正,你可以按需调整。
改写后求和查询
SELECT SUM( -- 先把字符串价格转为数值,处理德式逗号小数点 CAST( REPLACE( CASE WHEN KHKVKBelegePositionen.StuecklistenTyp = '0' THEN KHKVKBelegePositionen.Gesamtpreis WHEN KHKVKBelegeStuecklisten.Gesamtpreis != '0,00' AND KHKVKBelege.A0Land != 'DE' AND KHKVKBelegePositionen.Artikelgruppe NOT IN ('181','182','183') AND KHKVKBelegePositionen.StuecklistenTyp != '0' THEN KHKVKBelegeStuecklisten.Gesamtpreis WHEN KHKVKBelegePositionen.Artikelgruppe IN ('181','182','183') AND KHKVKBelegePositionen.StuecklistenTyp != '0' THEN KHKVKBelegeStuecklisten.Gesamtpreis ELSE KHKVKBelegeStuecklisten.GesamtpreisInternEW END, ',', '.' -- 把德式逗号小数点替换为标准点格式 ) AS DECIMAL(18,2) ) ) AS Gesamtpreis_Sum FROM KHKVKBelegeStuecklisten (READUNCOMMITTED) INNER JOIN KHKVKBelege ON KHKVKBelegeStuecklisten.Belid = KHKVKBelege.BElid INNER JOIN KHKVKBelegePositionen ON KHKVKBelegeStuecklisten.BelID = KHKVKBelegePositionen.BelID WHERE KHKVKBelegePositionen.BelID = '3519582' GROUP BY KHKVKBelegePositionen.BelID
以上查询会直接返回你示例数据的求和结果16.32,可以直接用于后续更新操作。
批量更新参考示例
如果你需要批量更新所有单据的总价格,可以参考下面的写法:
UPDATE t SET t.需要更新的总价格字段 = s.Gesamtpreis_Sum FROM 你要更新的表 t INNER JOIN ( -- 去掉WHERE单ID限制即可批量计算所有单据的总价格 SELECT KHKVKBelegePositionen.BelID, SUM( CAST( REPLACE( CASE WHEN KHKVKBelegePositionen.StuecklistenTyp = '0' THEN KHKVKBelegePositionen.Gesamtpreis WHEN KHKVKBelegeStuecklisten.Gesamtpreis != '0,00' AND KHKVKBelege.A0Land != 'DE' AND KHKVKBelegePositionen.Artikelgruppe NOT IN ('181','182','183') AND KHKVKBelegePositionen.StuecklistenTyp != '0' THEN KHKVKBelegeStuecklisten.Gesamtpreis WHEN KHKVKBelegePositionen.Artikelgruppe IN ('181','182','183') AND KHKVKBelegePositionen.StuecklistenTyp != '0' THEN KHKVKBelegeStuecklisten.Gesamtpreis ELSE KHKVKBelegeStuecklisten.GesamtpreisInternEW END, ',', '.' ) AS DECIMAL(18,2) ) ) AS Gesamtpreis_Sum FROM KHKVKBelegeStuecklisten (READUNCOMMITTED) INNER JOIN KHKVKBelege ON KHKVKBelegeStuecklisten.Belid = KHKVKBelege.BElid INNER JOIN KHKVKBelegePositionen ON KHKVKBelegeStuecklisten.BelID = KHKVKBelegePositionen.BelID GROUP BY KHKVKBelegePositionen.BelID ) s ON t.BelID = s.BelID
内容的提问来源于stack exchange,提问作者VonFrosta
相关产品推荐
相关产品推荐

