如何基于Select语句生成的列统计采购订单数量并分组?
解决CASE生成字段的分组统计问题
我完全懂你遇到的困扰——当你用CASE语句动态生成了OrderNumber(比如标记为PurchaseOrder)和Price category(比如1.Low Price、2.Average Price这类)两列后,想要统计每个组合的订单数量,核心思路就是把这两个动态生成的字段作为分组依据就行,下面给你两种实用的实现方式:
方式一:按生成字段分组(行式统计)
这是最直接的方案,把CASE生成的两个字段放到GROUP BY子句中,用COUNT(*)统计每组的行数:
SELECT -- 生成OrderNumber标记字段 CASE WHEN order_type = 'P' THEN 'PurchaseOrder' ELSE 'OtherOrder' END AS OrderNumber, -- 生成价格分类字段 CASE WHEN price < 100 THEN '1.Low Price' WHEN price BETWEEN 100 AND 500 THEN '2.Average Price' ELSE '3.High Price' END AS PriceCategory, -- 统计当前组的订单数量 COUNT(*) AS NumberOfPurchases FROM your_table_name GROUP BY -- 多数数据库支持直接用SELECT里的别名分组(比如MySQL、PostgreSQL) OrderNumber, PriceCategory;
如果你的数据库不支持直接用别名分组(比如部分老版本SQL Server),只需要把GROUP BY里的内容替换成和SELECT中完全一致的CASE逻辑即可:
SELECT CASE WHEN order_type = 'P' THEN 'PurchaseOrder' ELSE 'OtherOrder' END AS OrderNumber, CASE WHEN price < 100 THEN '1.Low Price' WHEN price BETWEEN 100 AND 500 THEN '2.Average Price' ELSE '3.High Price' END AS PriceCategory, COUNT(*) AS NumberOfPurchases FROM your_table_name GROUP BY CASE WHEN order_type = 'P' THEN 'PurchaseOrder' ELSE 'OtherOrder' END, CASE WHEN price < 100 THEN '1.Low Price' WHEN price BETWEEN 100 AND 500 THEN '2.Average Price' ELSE '3.High Price' END;
方式二:条件聚合(列式统计)
如果更希望把不同价格分类的数量作为单独列展示(比如一行就显示PurchaseOrder下所有价格区间的订单数),可以用条件聚合的方式实现:
SELECT CASE WHEN order_type = 'P' THEN 'PurchaseOrder' ELSE 'OtherOrder' END AS OrderNumber, -- 统计Low Price类别的订单数 COUNT(CASE WHEN price < 100 THEN 1 END) AS LowPriceNumberOfPurchases, -- 统计Average Price类别的订单数 COUNT(CASE WHEN price BETWEEN 100 AND 500 THEN 1 END) AS AveragePriceNumberOfPurchases, -- 统计High Price类别的订单数 COUNT(CASE WHEN price > 500 THEN 1 END) AS HighPriceNumberOfPurchases FROM your_table_name GROUP BY OrderNumber;
你可以根据自己的报表展示需求,选择对应的实现方式。
内容的提问来源于stack exchange,提问作者Xavier Maldonado
相关产品推荐
相关产品推荐

