如何用单条SQL语句计算指定月份每日销售额与退货额的差值?
当然可以通过单条SQL语句实现这个需求!我们可以利用**左连接(LEFT JOIN)**将销售表和退货表的统计结果按日期关联,再结合COALESCE函数处理无退货记录的情况,最终计算出每日的销售净额。
实现的SQL语句
SELECT s.valDay, s.valTotal - COALESCE(r.valTotal, 0) AS valTotal FROM ( -- 子查询:统计12月每日销售总额 SELECT strftime('%m/%d', Date) as valDay, SUM(TotalPrice) as valTotal FROM Sales WHERE strftime('%m', Date) ='12' GROUP BY valDay ) s -- 左连接退货统计结果,确保所有销售日期都被保留 LEFT JOIN ( -- 子查询:统计12月每日退货总额 SELECT strftime('%m/%d', Date) as valDay, SUM(TotalPrice) as valTotal FROM return WHERE strftime('%m', Date) ='12' GROUP BY valDay ) r ON s.valDay = r.valDay ORDER BY s.valDay;
关键逻辑说明
- 子查询封装:把你原本的两个统计语句分别封装为子查询
s(销售数据)和r(退货数据),让主逻辑更清晰。 - LEFT JOIN的作用:以销售统计的日期为基准,保证所有有销售记录的日期都会出现在结果中,哪怕当天没有退货。
- COALESCE处理空值:当某日期没有退货记录时,
r.valTotal会是NULL,用COALESCE(r.valTotal, 0)把空值替换为0,这样减法运算就能正常得到销售总额本身。 - 排序保证顺序:最后按
valDay排序,让结果和你预期的日期顺序一致。
执行结果
执行后会得到符合需求的每日净额:
| valDay | valTotal |
|---|---|
| 12/01 | 40.0 |
| 12/02 | 50.0 |
| 12/04 | 50.0 |
| 12/05 | 20.0 |
| 12/06 | 160.0 |
| 12/07 | 30.0 |
| 12/08 | 60.0 |
| 12/09 | 50.0 |
内容的提问来源于stack exchange,提问作者dins88
相关产品推荐
相关产品推荐

