Я пытаюсь выполнить запрос в SQL Server 2008 к таблице, в которую некоторые данные были введены непоследовательно, и я должен обработать это.
Пример таблицы данных:
OrderID Qty Price MarkedUpTotal
1 10 1.00 11.00
1 -1 1.00 -1.10
1 -1 1.00 1.10
Мне нужно разобраться с ситуацией, когда Qty отрицательно, но MarkedUpTotal был введен как положительный.
Я бы хотел выполнить следующий запрос:
SELECT OrderID, SUM(Qty) as OrderTotalQty,
SUM(Qty*Price) as InternalCost,
CASE WHEN Qty < 0 and MarkedUpTotal > 0
THEN sum(-1*MarkedUpTotal)
ELSE SUM(MarkedUpTotal) END as ClientCost
FROM OrderItems
GROUP BY OrderID
Однако при выполнении этого запроса я получаю следующую ошибку:
Колонка Qty недопустима в списке выбора, поскольку она не содержится ни в статистической функции, ни в предложении GROUP BY.
Столбец MarkedUpTotal недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.
Мне нужен следующий результат:
OrderID OrderTotalQty InternalCost ClientCost
1 8 8.00 8.80
Мне кажется странным, что я должен использовать GROUP BY Qty и MarkedUpTotal, когда они используются только условно оператором CASE. Если я удаляю последний выбор (оператор CASE), запрос выполняется нормально и не требует наличия Qty или Price в GROUP BY.
Почему SQL требует этого? Есть ли один запрос, который мог бы выполнить вышеуказанное?
В настоящее время я решаю проблему, используя временную таблицу. Я изменяю MarkedUpTotal каждой записи, если необходимо, а затем делаю простой SUM (MarkedUpTotal) в основном запросе из временной таблицы.