SQL 查询以获取最近订单的值以及来自其他表的数据

SQL Query to get value of recent order alongwith data from other tables

我正在编写一个 SQL 查询以从 3 个以上的表中获取数据,但为了简化这里的问题,我使用了一个包含 3 个表的类似场景。

表 1 客户(PK-CustomerID,姓名)

CustomerID Name
1 John
2 Tina
3 Sam

表 2 销售额(FK-Id,销售价格)

ID SalePrice
1 200.00
2 300.00
3 400.00

表 3 订单(PK-Id、FK-CustomerID、日期、金额)

Id CustomerID Date Amount
101 1 25-09-2021 30.0
102 1 27-09-2021 40.0
103 2 19-09-2021 60.0

在输出中,日期和金额应该是客户的最新订单(最新日期)

我的方法是

    Select c.CustomerID, c.Name, s.SalePrice, RecentOrder.Date, RecentOrder.Amount from 
    Customer as c
    LEFT JOIN Sales s ON c.CustomerID = s.ID
    LEFT JOIN (SELECT top 1 o.Date, o.Amount, o.CustomerID  
    FROM Order o, Customer c1 WHERE c1.CustomerID = o.CustomerID ORDER BY o.Date DESC) 
    RecentOrder ON c.CustomerID = RecentOrder.CustomerID

我得到的输出

客户 ID、姓名、销售价格、日期、金额

CustomerID Name SalePrice Date Amount
1 John 200.00 27-09-2021 40.0
2 Tina 300.00 null null
3 Sam 400.00 null null

我得到的输出包括所有订单中的最新订单。但是我想从该客户的订单中获取最近的订单

需要输出

客户 ID、姓名、销售价格、日期、金额

CustomerID Name SalePrice Date Amount
1 John 200.00 27-09-2021 40.0
2 Tina 300.00 19-09-2021 60.0
3 Sam 400.00 null null

您需要为 每个 客户订单预先汇总或识别最近的订单,您的查询正在为 all 选择 1 行订单。

尝试以下方法(未经测试!)

select c.CustomerID, c.Name, s.SalePrice, o.Date, o.Amount 
from Customer c
left join Sales s on c.CustomerID = s.ID
outer apply (
    select top (1) date, amount
    from [order] o
    where o.CustomerId=c.CustomerId
    order by Id desc
)o

除了左连接中的子查询,您可以使用外部应用进行检查。

检查以下方式

Select c.CustomerID, c.Name, s.SalePrice, RecentOrder.Date, RecentOrder.Amount 
from Customer c
LEFT JOIN Sales s ON c.CustomerID = s.ID
OUTER APPLY (
SELECT top 1 o.Date, o.Amount, o.CustomerID  
FROM [Order] o 
WHERE o.CustomerID = c.CustomerID ORDER BY o.Date DESC) RecentOrder`