选择客户最近的发票价格与报价

问题描述 投票:0回答:1

我有两张表想要查询和比较。我想找到客户支付的最新价格,并将其与同一商品的最新报价进行比较,但仅当两个价格不同时才返回结果。下面是一些模拟表。

表1(发票)

客户 项目 价格 翻译日期
1505 ABC 3.04 2024-5-17
2106 ABC 5.20 2024-4-01
1505 ABC 2.96 2024-1-16
1505 ABC 3.15 2023-12-15

表2(报价)

客户 项目 价格 翻译日期
1505 ABC 2.96 2024-7-29
1505 ABC 3.08 2024-6-15

我可以生成显示与上面的表 1 和表 2 类似的结果的单独查询。这是我正在努力解决的结合和最新的价值观。

结果

客户 项目 库存价格 报价价格
1505 ABC 3.04 2.96

我尝试过的脚本。

SELECT Invoices.Customer, Invoices.Item, Invoices.Price AS [InvPrice], Quotes.Price AS [QuotePrice]
FROM Invoices
JOIN Quotes ON Quotes.Customer = Invoices.Customer
WHERE Quotes.Price <> Invoices.Price
AND Invoices.TranDate = (SELECT MAX(TranDate) FROM Invoices)
ORDER BY Customer

谢谢!

sql sql-server join select max
1个回答
0
投票

您可以使用

ROW_NUMBER
函数获取发票和报价表的最后记录,并使用一些子查询来获取您需要的结果。或者,您可以使用 CTE 而不是子查询。

下面的查询对发票表执行以下操作。

  1. 使用
    ROW_NUMBER
    函数获取每行的行号。它按客户和项目对数据进行分区,然后按 TranDate 按降序对数据进行排序。
  2. 过滤步骤 1 中的 RowNumber 等于 1 的行。
  3. 它对 Quotes 表执行相同的操作,以从 Quotes 表中获取最新记录。
  4. 然后我们
    INNER JOIN
    引用子查询以仅包含结果集中具有匹配引号的行。
  5. 最后过滤报价和发票价格不同的数据。

请注意,此查询在大型数据集上会很慢。表中正确的索引应该会有所帮助,但根据我的经验,对于大型数据集,ROW_NUMBER 函数往往会很慢。

SELECT 
    LastInvoice.Customer,
    LastInvoice.Item,
    LastInvoice.Price AS InvPrice,
    LastQuote.Price AS QuotePrice
FROM
(
    SELECT * FROM
    (
        SELECT 
            Customer, 
            Item, 
            Price, 
            TranDate,
            ROW_NUMBER() OVER (PARTITION BY Customer, Item ORDER BY TranDate DESC) AS RowNumber
        FROM Invoices
    ) AS GroupedResult
    WHERE GroupedResult.RowNumber = 1
) AS LastInvoice
INNER JOIN 
(
    SELECT * FROM
    (
        SELECT
            Customer, 
            Item, 
            Price, 
            TranDate,
            ROW_NUMBER() OVER (PARTITION BY Customer, Item ORDER BY TranDate DESC) AS RowNumber
        FROM Quotes
    ) AS GroupedResult
    WHERE GroupedResult.RowNumber = 1
) AS LastQuote
    ON LastQuote.Customer = LastInvoice.Customer
WHERE LastQuote.Price <> LastInvoice.Price
© www.soinside.com 2019 - 2024. All rights reserved.