求SQL查询语句:对比单个周六总销售额与全年周六平均总销售额
对比指定周六销售额与全年周六平均销售额的SQL查询
嘿,这就帮你搞定这个需求!下面我会用清晰的逻辑编写查询语句,还会适配不同主流数据库的语法差异,让你直接能用。
核心思路
我们分三步来实现:
- 第一步:计算每个周六的总销售额(按日期分组)
- 第二步:基于第一步的结果,计算全年所有周六的平均总销售额
- 第三步:把指定周六的销售额和这个平均值关联起来,做直观对比
通用SQL方案(以PostgreSQL/标准SQL为例)
用公共表表达式(CTE)来拆分逻辑,可读性更强:
WITH weekly_saturday_sales AS ( -- 计算每个周六的总销售额 SELECT DATE_TRUNC('day', ts) AS sale_date, SUM(quantity * unit_price) AS total_sales FROM your_table_name -- 替换成你的实际表名 WHERE EXTRACT(DOW FROM ts) = 6 -- DOW=6代表周六(一周从周日开始计数) GROUP BY DATE_TRUNC('day', ts) ), average_saturday_sales AS ( -- 计算全年所有周六的平均总销售额 SELECT AVG(total_sales) AS avg_weekly_sales FROM weekly_saturday_sales ) -- 对比指定周六与平均值 SELECT w.sale_date, w.total_sales AS target_saturday_sales, a.avg_weekly_sales, -- 新增差值和百分比字段,让对比更直观 w.total_sales - a.avg_weekly_sales AS sales_diff_from_avg, ROUND((w.total_sales / a.avg_weekly_sales - 1) * 100, 2) AS sales_pct_diff_from_avg FROM weekly_saturday_sales w CROSS JOIN average_saturday_sales a WHERE w.sale_date = '2019-01-12'; -- 替换成你要对比的目标周六日期
不同数据库的适配调整
MySQL 版本
MySQL里的日期函数略有不同,调整后代码如下:
WITH weekly_saturday_sales AS ( SELECT DATE(ts) AS sale_date, SUM(quantity * unit_price) AS total_sales FROM your_table_name WHERE DAYOFWEEK(ts) = 7 -- MySQL中7代表周六(1是周日) GROUP BY DATE(ts) ), average_saturday_sales AS ( SELECT AVG(total_sales) AS avg_weekly_sales FROM weekly_saturday_sales ) SELECT w.sale_date, w.total_sales AS target_saturday_sales, a.avg_weekly_sales, w.total_sales - a.avg_weekly_sales AS sales_diff_from_avg, ROUND((w.total_sales / a.avg_weekly_sales - 1) * 100, 2) AS sales_pct_diff_from_avg FROM weekly_saturday_sales w CROSS JOIN average_saturday_sales a WHERE w.sale_date = '2019-01-12';
SQL Server 版本
SQL Server需要先设置周起始日,避免日期判断出错:
-- 设置周日为一周的第一天,确保周六是第7天 SET DATEFIRST 7; WITH weekly_saturday_sales AS ( SELECT CAST(ts AS DATE) AS sale_date, SUM(quantity * unit_price) AS total_sales FROM your_table_name WHERE DATEPART(dw, ts) = 7 -- 周六 GROUP BY CAST(ts AS DATE) ), average_saturday_sales AS ( SELECT AVG(total_sales) AS avg_weekly_sales FROM weekly_saturday_sales ) SELECT w.sale_date, w.total_sales AS target_saturday_sales, a.avg_weekly_sales, w.total_sales - a.avg_weekly_sales AS sales_diff_from_avg, ROUND((w.total_sales / a.avg_weekly_sales - 1) * 100, 2) AS sales_pct_diff_from_avg FROM weekly_saturday_sales w CROSS JOIN average_saturday_sales a WHERE w.sale_date = '2019-01-12';
关键说明
- 记得把代码里的
your_table_name替换成你实际使用的表名 - 目标日期
'2019-01-12'要换成你需要对比的那个周六的日期 - 新增的
sales_diff_from_avg(差值)和sales_pct_diff_from_avg(百分比差异)字段能帮你快速看出指定周六的销售表现和平均水平的差距
内容的提问来源于stack exchange,提问作者Yianni Megaloudis
相关产品推荐
相关产品推荐

