SQL查询:如何将同一提单的多条商品记录合并并汇总数据
解决提单数据汇总问题
嘿,我一眼就看出你当前查询的问题啦——你把i.Weight和i.Pieces放进了GROUP BY子句里,这会让每条商品记录都单独成组,自然没法实现“一个提单一行”的汇总效果。
正确的查询思路
你需要用聚合函数对每个提单下的件数和重量做求和,同时只按提单的唯一标识及其他不需要聚合的字段分组。因为左连接可能会碰到没有对应商品记录的提单,所以最好用COALESCE把NULL值转换成0,避免结果显示为NULL。
修正后的SQL语句
SELECT b.BillOfLadingNumber, b.ShipFromCity, b.ShipFromState, b.ShipFromZip, b.DeliveryDate, b.ShipToCity, b.ShipToState, b.ShipToZip, COALESCE(SUM(i.Weight), 0) AS TotalWeight, COALESCE(SUM(i.Pieces), 0) AS TotalPieces, b.Id FROM vw_BillsOfLading b LEFT OUTER JOIN vw_Items i ON i.TransactionId = b.Id WHERE b.BillOfLadingNumber IN ('100277','100310','100814','100867','101118','101124','101530','101630','101657','101694','101760','102153','102241','102276','102284') GROUP BY b.Id, b.BillOfLadingNumber, b.ShipFromCity, b.ShipFromState, b.ShipFromZip, b.DeliveryDate, b.ShipToCity, b.ShipToState, b.ShipToZip
关键改动说明
- 用
SUM(i.Weight)和SUM(i.Pieces)替代直接选择i.Weight和i.Pieces,实现同提单下的数值汇总 - 加入
COALESCE函数:当某个提单没有对应商品记录时,左连接返回的i.Weight和i.Pieces会是NULL,COALESCE能把这些NULL转换成0,让结果更直观 - 从
GROUP BY中移除了i.Weight、i.Pieces和i.TransactionId,只保留提单表(vw_BillsOfLading)的字段——因为b.Id是提单的唯一标识,只要按它分组,就能保证每个提单只返回一行结果
如果你的SQL数据库支持函数依赖(比如PostgreSQL、MySQL关闭ONLY_FULL_GROUP_BY模式),其实GROUP BY只需要写b.Id就够了,其他提单字段会自动关联到唯一的b.Id,不过为了兼容性,把所有非聚合字段都放进GROUP BY是最稳妥的做法。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

