MySQL物料报表:多列同名物料数量合并求和实现方案
解决方案
要解决这个问题,核心是先把你的宽表结构(多组Material+Quantity列)转换成窄表结构(每行对应一个物料和它的数量),然后再按物料名分组求和。以下是可行的MySQL查询语句:
SELECT MaterialName, SUM(Quantity) AS Quantity FROM ( -- 把每一组Material和对应的Quantity拆成单独的行 SELECT Material1 AS MaterialName, Quantity1 AS Quantity FROM your_table UNION ALL SELECT Material2 AS MaterialName, Quantity2 AS Quantity FROM your_table UNION ALL SELECT Material3 AS MaterialName, Quantity3 AS Quantity FROM your_table ) AS unpivoted_data GROUP BY MaterialName ORDER BY MaterialName;
关键细节解释
- 用
UNION ALL而非UNION:UNION会自动去重,会丢失同一物料的多条记录,导致求和结果错误;UNION ALL会保留所有行,确保我们能统计到每一个物料的所有数量。 - 子查询的作用:子查询负责将原表的多列数据“展开”成多行——比如原表第一行的3个物料会被拆成3条独立的记录,每条记录对应一个物料和它的数量。
- 分组求和:外层查询对展开后的窄表按
MaterialName分组,用SUM(Quantity)计算每个物料的总数量。
为什么你之前的尝试有问题?
- 你的第一个查询只提取了物料名,没有关联对应的数量,自然无法求和。
- 第二个查询的
SUM(Quantity1 + Quantity2 + Quantity3)逻辑错误:它是把同一行的三个数量直接相加,而同一行的三个物料是不同的,这个求和结果没有任何实际意义,不是某个物料的总数量。
如果你的表后续增加了更多MaterialN和QuantityN列,只需要在子查询里继续添加UNION ALL SELECT MaterialN AS MaterialName, QuantityN AS Quantity FROM your_table即可。
内容的提问来源于stack exchange,提问作者dausfaul
相关产品推荐
相关产品推荐

