基于非主键合并多行数据为单行并按产品ID拆分数量列的SQL查询实现求助
实现订单产品数量的行转列查询
针对你需要将订单中的产品数量按order_id分组,转换为以quantity_产品ID命名列的需求,因为已知产品ID固定为111、112、113,我们可以用条件聚合的方式来实现,这是处理固定列转行场景最直接的方法。
完整SQL查询语句
假设你的原始表名为order_items(如果实际表名不同,请自行替换):
SELECT order_id, SUM(CASE WHEN product_id = '111' THEN quantity ELSE NULL END) AS quantity_111, SUM(CASE WHEN product_id = '112' THEN quantity ELSE NULL END) AS quantity_112, SUM(CASE WHEN product_id = '113' THEN quantity ELSE NULL END) AS quantity_113 FROM order_items GROUP BY order_id ORDER BY order_id;
语句解释
- 条件聚合:用
CASE WHEN判断当前行的product_id是否匹配目标产品,匹配则返回对应的quantity,否则返回NULL;再通过SUM(或者MAX也可以,因为每个订单下同一产品只会出现一次)聚合得到该订单对应产品的数量。 - 分组合并:通过
GROUP BY order_id把同一订单的所有行合并为一行,实现按订单维度的汇总。 - 列名自定义:用
AS关键字将聚合后的列命名为quantity_产品ID的格式,完全匹配你期望的结果结构。
执行结果验证
运行上述语句后,会输出你想要的格式:
| order_id | quantity_111 | quantity_112 | quantity_113 |
|---|---|---|---|
| A | 2 | 3 | 1 |
| B | 5 | 1 | NULL |
| C | NULL | 2 | NULL |
如果你的数据库支持IF函数(比如MySQL),也可以用更简洁的写法,效果完全一致:
SELECT order_id, SUM(IF(product_id = '111', quantity, NULL)) AS quantity_111, SUM(IF(product_id = '112', quantity, NULL)) AS quantity_112, SUM(IF(product_id = '113', quantity, NULL)) AS quantity_113 FROM order_items GROUP BY order_id ORDER BY order_id;
内容的提问来源于stack exchange,提问作者Akash Agarwal
相关产品推荐
相关产品推荐

