SQL技术需求:按周分组统计指定时段订单数并生成Excel报表
按年份筛选并按周统计订单量的SQL方案
嘿,我来帮你搞定这个按周统计订单的需求!不用怕SQL不精通,我把步骤拆得明明白白,你直接套用就行~
核心思路
我们需要从Orders表中:
- 筛选出指定年份的订单
- 把订单按周分组
- 统计每组的订单数量
适配不同数据库的SQL语句
不同数据库的周计算函数略有差异,我给你列几个常用的:
1. MySQL/MariaDB
这里用YEARWEEK()函数可以同时获取年份和周数(避免跨年周的混淆),如果需要指定周起始日(比如周一为一周开始),可以加参数1:
SELECT YEARWEEK(OrderDate, 1) AS year_week, -- 格式为YYYYWW,比如202401代表2024年第1周 DATE_FORMAT(MIN(OrderDate), '%Y-%m-%d') AS week_start_date, -- 显示该周的起始日期(可选) COUNT(OrderId) AS order_count FROM Orders WHERE YEAR(OrderDate) = 2024 -- 这里替换成用户选择的年份 GROUP BY year_week ORDER BY year_week;
如果想更直观显示周范围,可以把week_start_date和DATE_FORMAT(MAX(OrderDate), '%Y-%m-%d') AS week_end_date加上。
2. SQL Server
用DATEPART(WK, OrderDate)获取周数,配合年份筛选:
SELECT CONCAT(YEAR(OrderDate), RIGHT('0' + CAST(DATEPART(WK, OrderDate) AS VARCHAR), 2)) AS year_week, DATEADD(DAY, 1 - DATEPART(WEEKDAY, OrderDate), MIN(OrderDate)) AS week_start_date, -- 周一为起始日 COUNT(OrderId) AS order_count FROM Orders WHERE YEAR(OrderDate) = 2024 -- 替换为目标年份 GROUP BY YEAR(OrderDate), DATEPART(WK, OrderDate) ORDER BY year_week;
注意:SQL Server默认周日为一周第一天,如果要改成周一,可以用SET DATEFIRST 1;在查询前执行。
3. PostgreSQL
用EXTRACT(WEEK FROM OrderDate)获取周数:
SELECT CONCAT(EXTRACT(YEAR FROM OrderDate), LPAD(EXTRACT(WEEK FROM OrderDate)::VARCHAR, 2, '0')) AS year_week, DATE_TRUNC('week', OrderDate) + INTERVAL '1 day' AS week_start_date, -- 周一为起始日(默认周日,加1天改周一) COUNT(OrderId) AS order_count FROM Orders WHERE EXTRACT(YEAR FROM OrderDate) = 2024 -- 替换为目标年份 GROUP BY year_week, DATE_TRUNC('week', OrderDate) ORDER BY year_week;
支持用户选择年份的方法
如果是做报表工具(比如Excel自带的Power Query,或者BI工具),可以把WHERE子句里的年份改成参数,让用户在界面上选择年份后自动替换。如果是手动运行SQL,只需要每次把2024改成用户需要的年份就行。
导出Excel报表的步骤
- 执行上面的SQL,得到统计结果;
- 把结果集复制,直接粘贴到Excel表格里;
- 或者用数据库自带的导出功能:比如MySQL的“导出向导”、SQL Server的“导出数据”工具,直接把查询结果导出为Excel文件。
这样你就能轻松得到指定年份的每周订单量报表啦!
内容的提问来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

