You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL销售表按代理拆分周内每日销售额的SQL查询方案

MySQL实现销售代表周内每日销量统计(行转列)

我在MySQL中有一张销售表NewDeals,希望通过单条SQL查询得到如下格式的结果:

AGENT, MONDAY_TOTAL, TUESDAY_TOTAL,WEDNESDAY_TOTAL,THURSDAY_TOTAL,FRIDAY_TOTAL,SATURDAY_TOTAL

最初的尝试

我最初编写的SQL语句为:

SELECT DISTINCT(repname), DAYOFWEEK(sub_date), COUNT(*) 
FROM `NewDeals` 
WHERE WEEK(sub_date) = WEEK(CURRENT_DATE) 
GROUP BY repname, DAYOFWEEK(sub_date)

该语句返回的结果格式为:

AGENT, DAYOFWEEK, TOTAL

虽然可以通过代码转换格式,但我更希望直接用SQL实现目标格式。

中间的尝试与问题

于是我编写了如下SQL,尝试用行转列的方式直接得到目标格式:

SELECT repname, 
       SUM(IF(DAYOFWEEK(sub_date)=2, 1, 0)) AS MONDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=3, 1, 0)) AS TUESDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=4, 1, 0)) AS WEDNESDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=5, 1, 0)) AS THURSDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=6, 1, 0)) AS FRIDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=7, 1, 0)) AS SATURDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=1, 1, 0)) AS SUNDAY_TOTAL
FROM `NewDeals` 
WHERE WEEK(sub_date) = WEEK(CURRENT_DATE) 
GROUP BY repname

但该语句会返回往年同周的销售数据,经排查发现问题出在未限制年份,导致跨年度的同周记录被统计进来。

最终解决方案

修正后,添加年份限制的SQL语句如下:

SELECT repname, 
       SUM(IF(DAYOFWEEK(sub_date)=2, 1, 0)) AS MONDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=3, 1, 0)) AS TUESDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=4, 1, 0)) AS WEDNESDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=5, 1, 0)) AS THURSDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=6, 1, 0)) AS FRIDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=7, 1, 0)) AS SATURDAY_TOTAL,
       SUM(IF(DAYOFWEEK(sub_date)=1, 1, 0)) AS SUNDAY_TOTAL
FROM `NewDeals` 
WHERE WEEK(sub_date) = WEEK(CURRENT_DATE) AND YEAR(sub_date) = YEAR(CURRENT_DATE)
GROUP BY repname

内容的提问来源于stack exchange,提问作者Sparky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:45:36