TSQL在子查询中无效where子句

Rol*_*aer 2 sql t-sql sql-server

我有一种情况需要使用select语句在一行中选择当前和之前的订单金额.

订单表:

Customer Id
OrderId
OrderDate
OrderAmount
Run Code Online (Sandbox Code Playgroud)

当前选择声明:

SELECT o.OrderId, o.OrderDate, o.OrderAmount, po.OrderAmount
FROM Order o
LEFT JOIN (
   SELECT TOP(1) so.OrderAmount
   FROM Order so
   WHERE so.CustomerId = o.CustomerId and so.OrderId <> o.OrderId
   ORDER BY so.OrderDate DESC
   ) po
Run Code Online (Sandbox Code Playgroud)

问题是不允许子查询中的"where"子句.是否有另一种获取此信息的方法.

这实际上是对更复杂的选择(对于视图)的简化,其需要用于当前和上一报告期的财务报告的数据.

Mar*_*ith 8

你需要OUTER APPLY在这里.

你的WHERE条款看起来不正确.我假设OrderDate在下面能够确定"前一行"是唯一的.

SELECT o.OrderId,
       o.OrderDate,
       o.OrderAmount,
       po.OrderAmount
FROM   [Order] o
       OUTER APPLY(SELECT TOP(1) so.OrderAmount
                   FROM   [Order] so
                   WHERE  so.CustomerId = o.CustomerId
                          AND so.OrderDate < o.OrderDate
                   ORDER  BY so.OrderDate DESC) po  
Run Code Online (Sandbox Code Playgroud)

但是你可能会更好地离开加入 ROW_NUMBER

;WITH Ord
     AS (SELECT OrderId,
                OrderDate,
                OrderAmount,
                CustomerId,
                ROW_NUMBER() OVER ( PARTITION BY CustomerId 
                                       ORDER BY OrderDate)  AS RN
         FROM   [Order])
SELECT o.OrderId,
       o.OrderDate,
       o.OrderAmount,
       po.OrderAmount
FROM   Ord o
       LEFT JOIN Ord po
         ON o.CustomerId = po.CustomerId
            AND o.RN = po.RN + 1  
Run Code Online (Sandbox Code Playgroud)