使用Group By结合Select子查询时的工作日分组问题
不用多子查询关联,用条件聚合搞定按工作日分组统计
嘿,我完全懂你的困扰——8个子查询关联不仅写起来头疼,还容易出重复数据,简直是给自己挖坑!其实有个更简洁高效的方法:条件聚合(用CASE WHEN配合聚合函数),只需要一次表扫描就能搞定所有统计需求,再也不用折腾关联子查询了。
核心思路
按weekday分组后,对每个你需要统计的维度(比如不同支付类型的数量),用CASE WHEN筛选出符合条件的记录,再用COUNT/SUM等聚合函数计算结果。聚合函数会自动忽略CASE WHEN不满足条件时返回的NULL,完美实现分组后的多维度统计。
代码示例(以常见销售表为例)
假设你的表名为sales,包含字段:weekday(工作日标识)、payment_type(支付类型)、order_amount(订单金额)、order_id(订单ID)。下面是统计每种支付类型数量+其他销售指标的代码:
SELECT weekday, -- 统计各支付类型的订单数量 COUNT(CASE WHEN payment_type = '支付宝' THEN order_id END) AS alipay_order_count, COUNT(CASE WHEN payment_type = '微信支付' THEN order_id END) AS wechat_order_count, COUNT(CASE WHEN payment_type = '现金' THEN order_id END) AS cash_order_count, COUNT(CASE WHEN payment_type = '银行卡' THEN order_id END) AS card_order_count, -- 其他4种支付类型依此类推... -- 按工作日拆分的其他销售信息 COUNT(order_id) AS total_order_count, -- 当日总订单数 SUM(order_amount) AS total_sales_amount, -- 当日总销售额 AVG(order_amount) AS avg_order_amount -- 当日客单价 FROM sales GROUP BY weekday ORDER BY weekday; -- 按工作日排序,方便查看
为什么这个方法更好?
- 性能更优:只需要扫描一次数据表,比多次关联子查询的IO开销小很多;
- 代码简洁:所有统计逻辑写在一个查询里,便于维护和修改;
- 避免重复数据:直接按
weekday分组聚合,不会出现子查询关联导致的重复行问题。
小提示
- 如果你的
weekday是通过日期字段计算出来的(比如从order_date提取),可以直接在SELECT和GROUP BY里计算,比如MySQL用DAYOFWEEK(order_date) AS weekday,SQL Server用DATEPART(WEEKDAY, order_date) AS weekday; - 如果支付类型是动态变化的(不是固定8种),可以考虑用动态SQL生成
CASE WHEN语句,但固定类型的话,硬编码条件聚合是最省心的方案。
内容的提问来源于stack exchange,提问作者GhostBen
相关产品推荐
相关产品推荐

