SQL求助:关联Sales Orders等3张表实现销售订单产品信息单行输出
问题原因
你的语句出现同订单拆分为多行的核心原因是GROUP BY子句同时包含了Product Category、Sensor、Tablet三个字段:同个订单下的传感器、平板分属不同的订单项行,这三个字段的取值组合存在差异,就会被拆分为独立的分组输出,原语句里的DISTINCT也没有实际作用可以删除。
调整方案
仅按销售订单IDSOID分组,对其余三个计算字段使用聚合函数(如MAX)忽略空值,合并同个订单的所有取值即可,调整后的查询语句如下:
SELECT "Sales Orders"."id" AS "SOID", MAX(IF("Products"."SubType2" LIKE '%Sensors%', "Products"."Product Category", '')) AS "Product Category", MAX(IF("Products"."SubType2" LIKE '%Sensors%', "Products"."SubType3", '')) AS "Sensor", MAX(IF("Products"."SubType2" LIKE '%Tablets%', "Products"."SubType3", '')) AS "Tablet" FROM "Sales Orders" LEFT JOIN "Ordered Items" ON "Sales Orders"."id" = "Ordered Items"."Parent ID" INNER JOIN "Products" ON "Ordered Items"."Product Name" = "Products"."id" GROUP BY "Sales Orders"."id"
补充说明
如果同一个订单下存在多个同类型产品(比如2个不同型号的传感器),可以把MAX替换为对应数据库的字符串聚合函数,拼接多个型号值:
- MySQL 使用
GROUP_CONCAT:GROUP_CONCAT(IF("Products"."SubType2" LIKE '%Sensors%', "Products"."SubType3", '') SEPARATOR ',') AS "Sensor" - PostgreSQL、SQL Server 使用
STRING_AGG:STRING_AGG(IF("Products"."SubType2" LIKE '%Sensors%', "Products"."SubType3", ''), ',') AS "Sensor"
内容的提问来源于stack exchange,提问作者Ryan Fisher
相关产品推荐
相关产品推荐

