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

如何基于含价格变动的双表数据计算月度/季度销售总额?

你的两张数据表整理如下:

销售明细表(sales_details)

item idtransaction datelocation
1012023.01.20A
1022023.02.12A
1032023.05.25B
1022023.06.04C
1012023.11.24B

商品时段价格表(item_prices)

item IDpricevalid fromvalid to
10112023.01.012023.05.31
10132023.06.012023.12.31
10252023.01.012023.12.31
10342023.01.012023.12.31

解决方案

你之前关联失败的核心问题是:只靠item id关联会产生多对多匹配,必须加上销售日期落在对应价格有效期内的条件,才能精准匹配每笔销售的对应价格。

以下是具体实现(以MySQL为例,其他数据库仅需调整日期转换函数):

1. 月度销售总额报表

SELECT
    -- 提取年月,格式如"2023-01"
    DATE_FORMAT(STR_TO_DATE(s.`transaction date`, '%Y.%m.%d'), '%Y-%m') AS sale_month,
    SUM(p.price) AS total_sales
FROM
    sales_details s
JOIN
    item_prices p 
    ON s.`item id` = p.`item ID`
    -- 关键:确保销售日期在价格有效期区间内
    AND STR_TO_DATE(s.`transaction date`, '%Y.%m.%d') BETWEEN STR_TO_DATE(p.`valid from`, '%Y.%m.%d') AND STR_TO_DATE(p.`valid to`, '%Y.%m.%d')
GROUP BY
    sale_month
ORDER BY
    sale_month;

2. 季度销售总额报表

仅需修改日期分组格式,生成季度标识:

SELECT
    DATE_FORMAT(STR_TO_DATE(s.`transaction date`, '%Y.%m.%d'), '%Y-Q%q') AS sale_quarter,
    SUM(p.price) AS total_sales
FROM
    sales_details s
JOIN
    item_prices p 
    ON s.`item id` = p.`item ID`
    AND STR_TO_DATE(s.`transaction date`, '%Y.%m.%d') BETWEEN STR_TO_DATE(p.`valid from`, '%Y.%m.%d') AND STR_TO_DATE(p.`valid to`, '%Y.%m.%d')
GROUP BY
    sale_quarter
ORDER BY
    sale_quarter;

其他数据库适配提示

  • PostgreSQL:将STR_TO_DATE替换为TO_DATE(字段名, 'YYYY.MM.DD')
  • SQL Server:将STR_TO_DATE替换为CONVERT(DATE, 字段名, 102)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:15:35