SQL新手求助:查询特定月份下单量最多的门店ID
查询指定月份下单量最多的门店ID解决方案
嘿,作为SQL新手能想到尝试子查询已经超棒啦!咱们先看看你原语句里的小问题,再一步步补全出正确的查询语句~
原语句的问题点
- 子查询没有正确闭合,缺少必要的括号和逻辑分隔符
- 没有对每个门店的下单量进行计数统计,只是筛选了日期范围
- 末尾的
SELECT DISTINCT store属于语法错误,完全不符合当前需求逻辑
分步实现正确查询
我们的核心思路是:先统计每个门店在指定月份的下单次数,再找出下单次数最多的门店(还要考虑多个门店并列第一的情况)。
第一步:统计指定月份各门店的下单量
先写基础的统计语句,用COUNT(*)统计每个门店的下单数,GROUP BY store_id把同门店的记录分组:
SELECT store_id, COUNT(*) AS order_count FROM purchase WHERE purchase_date >= '2021-04-01' AND purchase_date <= '2021-04-30' GROUP BY store_id;
第二步:获取下单量最多的门店
这里分两种场景处理:
场景1:只取一个门店(不考虑并列第一的情况)
把第一步的统计结果作为子查询,按下单量降序排序后取第一行:
SELECT store_id FROM ( SELECT store_id, COUNT(*) AS order_count FROM purchase WHERE purchase_date >= '2021-04-01' AND purchase_date <= '2021-04-30' GROUP BY store_id ) AS store_orders ORDER BY order_count DESC LIMIT 1;
场景2:取所有下单量并列第一的门店(更严谨的场景)
如果存在多个门店下单量相同且都是最多的,我们用窗口函数来获取最大值并筛选:
SELECT store_id FROM ( SELECT store_id, COUNT(*) AS order_count, -- 计算所有门店中的最大下单量 MAX(COUNT(*)) OVER () AS max_order_count FROM purchase WHERE purchase_date >= '2021-04-01' AND purchase_date <= '2021-04-30' GROUP BY store_id ) AS store_orders WHERE order_count = max_order_count;
优化:让月份指定更灵活
如果不想每次手动写当月的起止日期,可以用数据库自带的日期函数来简化:
- MySQL/MariaDB:
SELECT store_id, COUNT(*) AS order_count FROM purchase WHERE YEAR(purchase_date) = 2021 AND MONTH(purchase_date) = 4 GROUP BY store_id;
- PostgreSQL:
SELECT store_id, COUNT(*) AS order_count FROM purchase WHERE DATE_TRUNC('month', purchase_date) = '2021-04-01' GROUP BY store_id;
- SQL Server:
SELECT store_id, COUNT(*) AS order_count FROM purchase WHERE DATEPART(YEAR, purchase_date) = 2021 AND DATEPART(MONTH, purchase_date) = 4 GROUP BY store_id;
这样只要修改年份和月份数值,就能快速切换查询的月份啦~
内容的提问来源于stack exchange,提问作者Phaya Naga
相关产品推荐
相关产品推荐

