You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期筛选的销售单据日总计及商品汇总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_IDdateamountqtydocument_total
22019012020100229145
4201901209045129145
42019012120050230100
62019012110050130100

内容的提问来源于stack exchange,提问作者Angel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:31:41