TSQL недействителен пункт where в подзапросе - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть ситуация, когда мне нужно выбрать текущую и предыдущую сумму заказа в одной строке, используя оператор выбора.

Таблица заказов:

Customer Id
OrderId
OrderDate
OrderAmount

Текущий оператор выбора:

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

Проблема в том, что предложение "where" в подзапросе недопустимо.Есть ли другой способ получения этой информации.

Это на самом деле упрощение более сложного выбора (для представления), который требует данных для финансовых отчетов за текущий и предыдущий отчетный период.

Ответы [ 4 ]

8 голосов
/ 14 декабря 2011

Вам понадобится 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  

Но вам, возможно, будет лучше, если вы присоединитесь к 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  
0 голосов
/ 14 декабря 2011

Для иллюстрации идеи ROW_NUMBER

with TheOrders as
( 
    select  row_number() over(order by orderdate desc) as RowNum,
            o.OrderId as OrderId
    from Orders o
)
select * from TheOrders
0 голосов
/ 14 декабря 2011
SELECT o.OrderId, o.OrderDate, o.OrderAmount, po.OrderAmount
FROM Order o
LEFT JOIN (
   SELECT TOP(1) so.OrderAmount
   FROM Order so
   ORDER BY so.OrderDate DESC
   ) po on po.OrderId <> o.OrderId
0 голосов
/ 14 декабря 2011

введите код здесь. Ваше предложение WHERE недопустимо, так как субвыбор не имеет контекста для псевдонима o.

Вы имели в виду:

ON so.OrderId <> o.OrderId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...