SQL Server 2008: вложенный оператор - PullRequest
4 голосов
/ 10 июня 2011

Я пытаюсь написать заявление для расчета суммы счета, каждого счета в виде нескольких продуктов и цены. Я получил:

SELECT SUM((UnitPrice-Discount)*Quantity)
FROM tblOrderDetails 
WHERE OrderID= OrderID 
GROUP BY OrderID ORDER BY OrderID 

Это работает нормально, теперь мне нужно добавить груз из другой таблицы (tblOrder), и вот где я застрял, я сделал:

SELECT OrderID, Freight+
    (SELECT SUM((UnitPrice-Discount)*Quantity)
    FROM tblOrderDetails 
    WHERE OrderID= OrderID 
    GROUP BY OrderID 
    ORDER BY OrderID)
FROM tblOrders

Но я продолжаю получать ошибку:

Предложение ORDER BY недопустимо в представления, встроенные функции, производные таблицы, подзапросы и общая таблица выражений, если TOP или FOR XML не также указано.

Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 10 июня 2011

Попробуйте:

SELECT o.OrderID, o.Freight + SUM((d.UnitPrice-d.Discount)*d.Quantity)
FROM tblOrderDetails d
JOIN tblOrders o ON o.OrderId = d.OrderId
GROUP BY o.OrderID, o.Freight
ORDER BY o.OrderID, o.Freight -- Freight avoids a potential re-order
2 голосов
/ 10 июня 2011

Это означает только то, что сказано: -)

Ошибка возникает потому, что при использовании гарантируется только упорядочение окончательного набора результатов (того, который возвращается клиенту)ORDER BY.Все промежуточные наборы результатов - это просто наборы записей, порядок элементов в наборе может различаться.ORDER BY работает с TOP, поскольку ограничивает набор результатов на основе "представления", установленного ORDER BY - однако, если это не верхний уровень ORDER BY, он не гарантирует порядок конечного набора результатов (только если выбраны «правильные» ТОП-записи).

То есть

SELECT FOO FROM (
  SELECT TOP 10 FOO FROM X
  ORDER BY FOO ASC) BAR

Не имеет гарантированного порядка записей в финалемножества результатов;значения FOO могут появляться в любом порядке.

Счастливое кодирование.

1 голос
/ 10 июня 2011

У вас не может быть этого ORDER BY в подзапросе. Я предполагаю, что вы оставили это во время разработки этой части запроса. Удалите это, и все будет в порядке.

SELECT OrderID, Freight+
    (SELECT SUM((UnitPrice-Discount)*Quantity)
    FROM tblOrderDetails 
    WHERE OrderID= OrderID 
    GROUP BY OrderID)
FROM tblOrders
1 голос
/ 10 июня 2011

Удалить ORDER BY OrderID:

SELECT OrderID, Freight+
    (SELECT SUM((UnitPrice-Discount)*Quantity)
    FROM tblOrderDetails 
    WHERE OrderID= OrderID 
    GROUP BY OrderID)
FROM tblOrders

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

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