SQL Server合并订单记录:统计含产品1&2或1&3的订单数
解决订单合并统计的SQL问题
嘿,这个问题很常见——你现在的GROUP BY里包含了Style,所以每个订单下不同的款式会拆成单独的行,自然没法合并成一条订单记录。咱们调整一下SQL的聚合逻辑就能搞定!
修改后的SQL语句
SELECT b.Order, MAX(CASE WHEN Style IN ('2','3') THEN '1' ELSE '0' END) AS Pants, MAX(CASE WHEN Style = '1' THEN '1' ELSE '0' END) AS Tunic FROM a INNER JOIN b ON a.join1 = b.join1 INNER JOIN c ON b.join2 = c.join2 WHERE Style IN ('1','2','3') GROUP BY b.Order ORDER BY b.Order;
关键调整点
- 去掉
Style的分组:把GROUP BY里的Style删掉,只按b.Order分组,这样每个订单只会生成一行记录。 - 用聚合函数
MAX()包裹CASE:MAX()会取每个订单下所有行的最大值——只要这个订单里有至少一个款式是2/3,Pants就会是'1';同理,只要有款式1,Tunic就会是'1',完美实现你要的合并效果。
后续统计需求扩展
如果之后你需要直接统计同时包含产品1和2,或1和3的订单数量,可以在上面的查询基础上再加一层筛选:
SELECT COUNT(DISTINCT Order) AS Qualified_Orders FROM ( SELECT b.Order, MAX(CASE WHEN Style IN ('2','3') THEN '1' ELSE '0' END) AS Pants, MAX(CASE WHEN Style = '1' THEN '1' ELSE '0' END) AS Tunic FROM a INNER JOIN b ON a.join1 = b.join1 INNER JOIN c ON b.join2 = c.join2 WHERE Style IN ('1','2','3') GROUP BY b.Order ) AS Order_Summary WHERE Pants = '1' AND Tunic = '1';
这样就能直接得到符合条件的订单总数啦!
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

