2015-04-01 3 views
0

У меня есть запрос:Агрегатная функция не дает сумму

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 

Результат:

enter image description here

Здесь у меня есть 0 и нуль в ama.FreeShiping

В основном этот столбец бит и содержит только 0 и 1. Таким образом, если 0 найдено, я делаю его -1000 для идентификации idorder, имеющего 0 или null как Freeshipping

Но он не дает правильную сумму, он должен давать результат в -ve для каждого столбца.

+0

Если вы удалите 'SUM()' и 'GROUP BY', я подозреваю, что вы найдете несколько строк для' idorder' 350184 и 350185, оба из которых будут иметь 'ama.FreeShipping'' 1'. Вы суммируете эти несколько строк и в итоге получаете '2'. – JNevill

+0

Может быть, я что-то пропустил, но если ama.freeshipping! = 0 означает, что нет нулевого значения, поэтому аргумент case бесполезен, поскольку у вас никогда не будет нуля. – xQbert

ответ

1

Это выражение в предложении where:

AND ama.FreeShiping != 0 

только выбирает значения, которые являются "1". Удалите это, если хотите увидеть другие значения.

Вы также должны научиться использовать правильный синтаксис join. Если вы использовали ключевое слово join, то большинство условий было бы в статьях on, и это условие where могло быть легче обнаружить.

Смежные вопросы