我们有两个新任务:任务3(删除无效数据)和任务4(多维度统计与占比计算)。需结合表结构逻辑设计SQL,确保数据操作安全且逻辑严谨。
id=4
为例)表结构关联:order_detail
的order_no
是外键,关联order_header
的order_no
。需先定位无效记录,再删除。
逻辑解释:
NOT IN
子查询找到order_header
中不存在的order_no
,再结合id=4
条件定位到具体行删除。id=4
),可简化为:
需求拆解:
收货店铺(gr_store_code)
、商品编码(article_code)
order_date BETWEEN '2022-01-01' AND '2022-03-01'
SUM(od.order_qty)
)商品订单数量 / 店铺总订单数量
实现步骤(窗口函数优化):
通过WITH
子句先计算店铺总订单数量,再用窗口函数关联占比。
id=4
限定删除范围,避免全表扫描风险;实际场景中需结合业务逻辑(如是否有外键约束)调整。WITH
子句拆分“店铺总数量”和“商品分店铺数量”,通过JOIN
关联后计算占比,既保证数据关联性,又避免重复聚合。ROUND(..., 2)
保留两位小数,*1.0
确保除法为浮点运算(避免整数除法截断)。若需简化任务4(不拆分子查询),也可通过关联子查询实现:
但此写法子查询重复执行,性能略逊于WITH
子句,建议优先用窗口函数方案。
以上SQL覆盖任务3和任务4的核心逻辑,可根据实际数据库(如MySQL、PostgreSQL)的语法差异微调。
id=4
为例)需先通过 左连接 定位 order_detail
中无匹配 order_header
的记录,再执行删除。
需同时统计 店铺总订单量 和 各商品订单量,通过窗口函数或子查询计算占比。
任务3防误删:
LEFT JOIN + WHERE IS NULL
定位无匹配的记录,再通过 id=4
精准删除(避免误删有效数据)。id=4
),可简化为:
任务4占比计算:
*1.0
将整数转为浮点数,避免 INT/INT
截断(如 5/2=2
而非 2.5
)。SUM() OVER (PARTITION BY ...)
可高效跨行聚合,减少子查询嵌套。以上SQL可直接在支持窗口函数(如MySQL 8+、PostgreSQL)的数据库中运行,若使用旧版本(如MySQL 5.x),优先选择方法2(子查询)。