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

SQL如何将不同日期价格数据合并为单行两列实现交易价格对比

解决方案

你可以直接通过两次左关联Prices表实现需求,一次关联匹配交易当日的理论价,一次关联匹配交易前一日的理论价,无需聚合或行转列操作,写法如下:

SELECT 
    T.Transaction_no,
    T.ID_no,
    T.Price_Traded,
    T.Trade_Date,
    P_TD.Price_Theo AS Price_Theo_TD,
    P_TD1.Price_Theo AS [Price_Theo TD-1]
FROM Transactions T
-- 关联当日理论价
LEFT JOIN Prices P_TD 
    ON T.ID_no = P_TD.ID_no 
    AND P_TD.Date = T.Trade_Date
-- 关联前一日理论价
LEFT JOIN Prices P_TD1 
    ON T.ID_no = P_TD1.ID_no 
    AND P_TD1.Date = T.Trade_Date - INTERVAL '1' DAY
WHERE T.Transaction_no IN ('T1', 'T2')

说明

  • 你之前的查询返回两行是因为单次关联匹配到了两日的价格记录,拆分两次关联即可把两个价格映射到不同列
  • 用左关联可以兼容部分交易不存在对应日期理论价的场景,缺失的价格会返回NULL
  • 如果你的数据库环境不支持INTERVAL写法,可以替换为对应数据库的日期计算语法,比如SQL Server中可以写成DATEADD(DAY, -1, T.Trade_Date)

如果你确实想用PIVOT实现也可以,虽然需要用到聚合函数,但因为同一个ID、同一个日期只会对应一条理论价,用MAX/MIN聚合不会改变原始值,参考写法:

SELECT 
    Transaction_no,
    ID_no,
    Price_Traded,
    Trade_Date,
    [0] AS Price_Theo_TD,
    [1] AS [Price_Theo TD-1]
FROM (
    SELECT 
        T.Transaction_no,
        T.ID_no,
        T.Price_Traded,
        T.Trade_Date,
        P.Price_Theo,
        DATEDIFF(DAY, P.Date, T.Trade_Date) AS Day_Diff
    FROM Transactions T
    JOIN Prices P ON T.ID_no = P.ID_no
    WHERE T.Transaction_no IN ('T1', 'T2')
        AND DATEDIFF(DAY, P.Date, T.Trade_Date) IN (0,1)
) AS Source
PIVOT (
    MAX(Price_Theo)
    FOR Day_Diff IN ([0],[1])
) AS PivotTable

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:48:03