【问题标题】:SQL Query to get value of recent order alongwith data from other tablesSQL 查询以获取最近订单的值以及来自其他表的数据
【发布时间】:2021-09-15 06:23:51
【问题描述】:

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

Table1 客户(PK-CustomerID,姓名)

CustomerID Name
1 John
2 Tina
3 Sam

Table2 销售额(FK-Id、SalePrice)

ID SalePrice
1 200.00
2 300.00
3 400.00

Table3 订单(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

【问题讨论】:

  • 可能是时候抛弃这种 30 年前已弃用的语法了!您的查询还应该产生一个名为 order 的表的错误 - 它应该是 [order] - 但是通过调用它是完全可以避免的 orders - 大概它包含多个订单?
  • 有些人喜欢给对象名称“单例”名称,@Stu,所以问题实际上是它是一个保留关键字。如果 OP 想要一个单例名称,也许 CustomerOrder 会是更好的选择。

标签: sql sql-server tsql left-join sql-order-by


【解决方案1】:

可以用外部应用代替左连接中的子查询。

检查以下方式

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`   

【讨论】:

    【解决方案2】:

    您需要为 每个 个客户订单预先汇总或识别最近的订单,您的查询是为 所有 个订单选择 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
    

    【讨论】:

      猜你喜欢
      • 2017-01-06
      • 2023-03-31
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多