У меня есть запрос:Агрегатная функция не дает сумму
SELECT o.idorder,
sum(CASE
WHEN cast(isnull(ama.FreeShiping, 0) AS INT) = 0
THEN - 1000
ELSE cast(isnull(ama.FreeShiping, 0) AS INT)
END) FreeShiping
FROM OrderDetail od,
amazonsku ama,
orders o,
TempPrintRecords tmp
WHERE o.idOrder = od.idOrder
AND o.idCustomer = ama.idCustomer
AND od.SKU = ama.Sku
--and od.idOrder=350184
AND od.idOrder = tmp.idOrder
AND ama.FreeShiping != 0
GROUP BY o.idorder
Результат:
Здесь у меня есть 0 и нуль в ama.FreeShiping
В основном этот столбец бит и содержит только 0 и 1. Таким образом, если 0 найдено, я делаю его -1000 для идентификации idorder
, имеющего 0 или null как Freeshipping
Но он не дает правильную сумму, он должен давать результат в -ve для каждого столбца.
Если вы удалите 'SUM()' и 'GROUP BY', я подозреваю, что вы найдете несколько строк для' idorder' 350184 и 350185, оба из которых будут иметь 'ama.FreeShipping'' 1'. Вы суммируете эти несколько строк и в итоге получаете '2'. – JNevill
Может быть, я что-то пропустил, но если ama.freeshipping! = 0 означает, что нет нулевого значения, поэтому аргумент case бесполезен, поскольку у вас никогда не будет нуля. – xQbert