基于日期筛选的销售单据日总计及商品汇总SQL查询需求
解决带每日单据总计的商品销售分组报表需求
没问题,我来帮你搞定这个需求——既要按商品ID和日期分组统计销售金额、数量,同时每行显示对应日期的所有单据总金额。下面给你两种实用的SQL实现方案:
方案一:用窗口函数(推荐,简洁高效)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),这是最省心的方法,不需要额外关联表就能直接计算每日总计:
SELECT item_ID, date, SUM(amount) AS amount, SUM(qty) AS qty, -- 按日期分区,计算当日所有单据的总金额 SUM(SUM(amount)) OVER (PARTITION BY date) AS document_total FROM sale GROUP BY item_ID, date ORDER BY date, item_ID;
逻辑说明:
- 内层
SUM(amount)和SUM(qty):按item_ID+date分组,统计单个商品当日的销售金额和数量 - 外层
SUM(SUM(amount)) OVER (PARTITION BY date):把同一日期下所有商品的分组金额再次求和,得到当日的单据总金额
方案二:子查询关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以先通过子查询计算每日总金额,再和分组结果关联:
方式A:用CTE(公共表表达式)
-- 先计算每日的单据总金额 WITH daily_total AS ( SELECT date, SUM(amount) AS document_total FROM sale GROUP BY date ) SELECT s.item_ID, s.date, SUM(s.amount) AS amount, SUM(s.qty) AS qty, dt.document_total FROM sale s JOIN daily_total dt ON s.date = dt.date GROUP BY s.item_ID, s.date, dt.document_total ORDER BY s.date, s.item_ID;
方式B:直接子查询关联
SELECT s.item_ID, s.date, SUM(s.amount) AS amount, SUM(s.qty) AS qty, dt.document_total FROM sale s JOIN ( SELECT date, SUM(amount) AS document_total FROM sale GROUP BY date ) dt ON s.date = dt.date GROUP BY s.item_ID, s.date, dt.document_total ORDER BY s.date, s.item_ID;
测试结果
以上两种方案执行后,都会得到你期望的输出格式:
| item_ID | date | amount | qty | document_total |
|---|---|---|---|---|
| 2 | 20190120 | 20100 | 2 | 29145 |
| 4 | 20190120 | 9045 | 1 | 29145 |
| 4 | 20190121 | 20050 | 2 | 30100 |
| 6 | 20190121 | 10050 | 1 | 30100 |
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

