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

如何不新增列引用不同行的值?采购订单价格差计算需求

解决方案建议

关于第一范式的顾虑

你担心新增派生列违反1NF是对的——直接在原始表中存上月价格和价格变动属于冗余存储,这些值完全可以通过基础数据计算得出,不仅不符合范式,还会增加数据维护风险(比如原始价格修改时,派生列得同步更新)。

更优的SQL计算方案(符合范式要求)

不用修改原始表结构,直接通过SQL查询实时计算所需字段,结果直接导入Power BI即可。分两种场景给出方案:

场景1:严格匹配上月(无上月记录则显示'-')

如果要求只有上个月存在该商品采购记录时才显示上月价格,否则显示'-'(和你的示例逻辑一致),用自连接+日期计算实现:

假设原始表名为purchase_order_prices,字段为item(商品)、month(日期类型,如'2020-01-01')、current_price(当前价格),SQL代码如下:

SELECT
    p1.item AS 商品,
    DATE_FORMAT(p1.month, '%Y年%m月') AS 月份,
    CONCAT('$', p1.current_price) AS 当前价格,
    CASE
        WHEN p2.current_price IS NULL THEN '-'
        ELSE CONCAT('$', p2.current_price)
    END AS 上月价格,
    CASE
        WHEN p2.current_price IS NULL THEN '-'
        ELSE CONCAT('$', p1.current_price - p2.current_price)
    END AS 价格变动
FROM purchase_order_prices p1
LEFT JOIN purchase_order_prices p2
    ON p1.item = p2.item
    AND DATE_ADD(p2.month, INTERVAL 1 MONTH) = p1.month
ORDER BY p1.item, p1.month;
  • 核心逻辑:通过DATE_ADD函数匹配当前月份的上一个月,用LEFT JOIN保留所有原始记录,无匹配时上月价格显示'-'

场景2:取最近一次历史价格(忽略缺月)

如果希望即使中间缺月,也取该商品最近一次的采购价格作为“上月价格”(比如2020年4月取2020年2月的价格),用窗口函数LAG()更高效:

SELECT
    item AS 商品,
    DATE_FORMAT(month, '%Y年%m月') AS 月份,
    CONCAT('$', current_price) AS 当前价格,
    CASE
        WHEN LAG(current_price) OVER (PARTITION BY item ORDER BY month) IS NULL THEN '-'
        ELSE CONCAT('$', LAG(current_price) OVER (PARTITION BY item ORDER BY month))
    END AS 上月价格,
    CASE
        WHEN LAG(current_price) OVER (PARTITION BY item ORDER BY month) IS NULL THEN '-'
        ELSE CONCAT('$', current_price - LAG(current_price) OVER (PARTITION BY item ORDER BY month))
    END AS 价格变动
FROM purchase_order_prices
ORDER BY item, month;
  • 核心逻辑:PARTITION BY item按商品分组,ORDER BY month按时间排序,LAG()直接取分组内上一条记录的价格

Power BI侧操作

把上述SQL查询的结果作为数据源导入Power BI,之后直接基于查询结果做可视化即可,不用在Power BI里做额外计算,完全符合你让Power BI专注可视化的需求。

总结

  • 原始表保持1NF:只存商品、月份、当前价格这些基础数据,避免冗余
  • 派生数据通过SQL实时计算:既符合范式,又能保证数据准确性,还降低维护成本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:31:21