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`
我正在编写一个 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`