SQL查询优化:消除零值并将双数据源的商品入库数量合并至同一行
解决思路与修改方案
嘿,你的SQL思路已经摸到门道了,问题出在分组维度和聚合逻辑的顺序上!原查询把data_source也加入了分组,导致每个product + inbound_type组合会生成两行数据(对应两个数据源),而CASE里的ELSE 0就产生了多余的零值。
修改后的SQL查询
SELECT product, inbound_type, SUM(CASE WHEN data_source = 'data_source_01' THEN quantity ELSE 0 END) AS quantity_data_source_01, SUM(CASE WHEN data_source = 'data_source_02' THEN quantity ELSE 0 END) AS quantity_data_source_02 FROM check_inbound GROUP BY product, inbound_type ORDER BY product, inbound_type;
关键修改点说明
- 调整分组维度:去掉
data_source的分组,只按product和inbound_type分组。这样每个产品+入库类型的组合只会生成一行结果,完美匹配你想要的合并行需求。 - 调整聚合与条件的顺序:把
SUM聚合函数放到CASE表达式外面,这样会针对每个product + inbound_type分组,分别统计对应数据源的数量总和。你的测试数据里每个分组在每个数据源下只有一条记录,用MAX替代SUM也能得到相同结果,但SUM更通用——如果后续某个分组在同一数据源下有多条记录,它能正确计算总数量。 - 消除零值:由于每个分组包含了两个数据源的记录,CASE表达式会精准匹配对应数据源的数量,不会再出现不必要的零值(如果某个数据源没有该分组的记录,才会显示0,这属于合理场景)。
执行结果
运行上面的查询后,就能得到你预期的结果格式:
| product | inbound_type | quantity_data_source_01 | quantity_data_source_02 |
|---|---|---|---|
| product_a | type_01 | 500 | 980 |
| product_a | type_02 | 200 | 315 |
| product_b | type_01 | 130 | 760 |
| product_b | type_02 | 320 | 512 |
| product_c | type_01 | 700 | 125 |
| product_c | type_02 | 850 | 720 |
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

