login
SQL订单数据处理与店铺统计
2025/09/02·StepFun can make mistakes, check important info.
2f4c28d8a7f848b4927378b6e4142d3a~tplv-9xxiciwj9y-image.image
继续完成3、4小题
Reason
思考过程

我们有两个新任务:任务3(删除无效数据)和任务4(多维度统计与占比计算)。需结合表结构逻辑设计SQL,确保数据操作安全且逻辑严谨。

任务3:删除单据明细表中“订单号不存在于单据抬头表”的数据(以id=4为例)

表结构关联order_detailorder_no是外键,关联order_headerorder_no。需先定位无效记录,再删除。

sql

逻辑解释

  • 先通过NOT IN子查询找到order_header中不存在的order_no,再结合id=4条件定位到具体行删除。
  • 若需批量删除所有无效记录(不限于id=4),可简化为:
    sql

任务4:查询2022-01-01至2022-03-01期间,每间收货店铺的商品订单数量汇总占比

需求拆解

  1. 统计维度:收货店铺(gr_store_code)商品编码(article_code)
  2. 时间范围:order_date BETWEEN '2022-01-01' AND '2022-03-01'
  3. 计算逻辑:
    • 商品订单数量:该店铺下该商品的订单数量总和(SUM(od.order_qty)
    • 店铺总订单数量:该店铺下所有商品的订单数量总和(需先按店铺分组求和)
    • 占比:商品订单数量 / 店铺总订单数量

实现步骤(窗口函数优化)
通过WITH子句先计算店铺总订单数量,再用窗口函数关联占比。

sql

关键设计说明

  1. 任务3防误删:通过id=4限定删除范围,避免全表扫描风险;实际场景中需结合业务逻辑(如是否有外键约束)调整。
  2. 任务4窗口函数替代:用WITH子句拆分“店铺总数量”和“商品分店铺数量”,通过JOIN关联后计算占比,既保证数据关联性,又避免重复聚合。
  3. 占比精度:用ROUND(..., 2)保留两位小数,*1.0确保除法为浮点运算(避免整数除法截断)。

若需简化任务4(不拆分子查询),也可通过关联子查询实现:

sql

但此写法子查询重复执行,性能略逊于WITH子句,建议优先用窗口函数方案。

以上SQL覆盖任务3和任务4的核心逻辑,可根据实际数据库(如MySQL、PostgreSQL)的语法差异微调。

任务3:删除单据明细表中订单号不存在于单据抬头表的数据(以 id=4 为例)

需先通过 左连接 定位 order_detail 中无匹配 order_header 的记录,再执行删除。

sql

任务4:查询2022-01-01至2022-03-01期间,每间收货店铺的商品订单数量汇总及占比

需同时统计 店铺总订单量各商品订单量,通过窗口函数子查询计算占比。

方法1:窗口函数(推荐,效率更高)

sql

方法2:子查询(逻辑更直观)

sql

关键逻辑说明

  1. 任务3防误删

    • 先用 LEFT JOIN + WHERE IS NULL 定位无匹配的记录,再通过 id=4 精准删除(避免误删有效数据)。
    • 若需批量删除所有无效记录(不限于 id=4),可简化为:
      sql
  2. 任务4占比计算

    • 核心是先聚合商品级数据,再关联店铺级汇总数据
    • *1.0 将整数转为浮点数,避免 INT/INT 截断(如 5/2=2 而非 2.5)。
    • 窗口函数 SUM() OVER (PARTITION BY ...) 可高效跨行聚合,减少子查询嵌套。

以上SQL可直接在支持窗口函数(如MySQL 8+、PostgreSQL)的数据库中运行,若使用旧版本(如MySQL 5.x),优先选择方法2(子查询)