SQL查询错误排查:2023年销量最高日期统计结果异常问题
问题排查与修正
核心错误点
销量统计逻辑完全错误
你用AVG(o.id)计算销量完全不合理——id是订单表的自增主键,它的平均值和销量没有任何关联。如果统计订单数量,应该用COUNT(o.id);如果统计商品总销量,需要关联order_items表统计SUM(qty)。WHERE子句条件无效且范围错误
DAYOFWEEK(o.created_at)没有设定判断条件,它返回1-7的数值(1=周日,2=周一…7=周六),非零值在SQL中会被判定为真,等于没加这个过滤规则。- 你只过滤了
year(o.created_at) = '2023',但需求是2023年1月1日到当前日期,正确写法应为o.created_at >= '2023-01-01' AND o.created_at <= CURRENT_TIMESTAMP。
排序逻辑错误
ORDER BY DAY(o.created_at)里的DAY()函数返回的是日期的“日”(比如1号、2号),不是星期几的顺序。要按星期排序,应该用DAYOFWEEK(o.created_at)或者WEEKDAY()(注意两者索引规则:DAYOFWEEK是1=周日,WEEKDAY是0=周一)。表名关键字冲突
order是SQL关键字,直接使用会报错,需要用反引号包裹成`order`。
修正后的SQL(两种常见场景)
场景1:统计每日订单数量
SELECT DAYNAME(o.created_at) AS day, COUNT(o.id) AS order_count FROM `order` o WHERE o.created_at >= '2023-01-01' AND o.created_at <= CURRENT_TIMESTAMP GROUP BY DAYNAME(o.created_at), DAYOFWEEK(o.created_at) ORDER BY DAYOFWEEK(o.created_at)
场景2:统计每日商品总销量(更符合“销量”常规定义)
SELECT DAYNAME(o.created_at) AS day, SUM(oi.qty) AS total_sales FROM `order` o JOIN order_items oi ON o.id = oi.order_id WHERE o.created_at >= '2023-01-01' AND o.created_at <= CURRENT_TIMESTAMP GROUP BY DAYNAME(o.created_at), DAYOFWEEK(o.created_at) ORDER BY DAYOFWEEK(o.created_at)
翻译后的表结构
- 订单表(
order):id(整数 主键 自增)、订单编号(字符串 非空)、订单类型(整数)、创建时间(时间戳) - 订单项表(
order_items):id(整数 主键 自增)、商品ID(整数)、订单ID(整数)、数量(整数)、单价(十进制)、创建时间(时间戳) - 商品表(
product):id(整数 主键 自增)、商品组ID(整数)、供应商ID(整数)、商品名称(字符串)、创建时间(时间戳)等
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

