У меня есть этот код, который суммирует количество для определенного элемента ( itemid
) и по коду даты продукта ( proddte
).
select sum(qty), itemid, proddte
from testtable where ....
group by itemid, proddte
То, что я хочу сделать, это получить общее количество qty
независимо от itemid/proddte
. Я пытался:
select sum(qty), itemid, proddte, sum(qty) over() as grandtotal
from testtable
where ....
group by itemid, proddte
Но это говорит, что я должен также иметь qty
в group by
пункте. Если я это сделаю, результат не будет равен моему ожидаемому результату.
Он не обязательно должен быть представлен в виде отдельного столбца с одинаковым значением в каждой строке. Любое представление принимается, пока я могу отображать общую сумму.
источник
GROUP BY ROLLUP((itemid,proddte))
даст тот же результат и может быть менее запутанным.itemid
Ie. Это эквивалентноGROUP BY GROUPING SETS((),(itemid),(itemid,proddte))
GROUP BY ROLLUP(itemid,proddte)
с другой стороны, действительно будет производить (дополнительные) промежуточные итоги поitemid
(так же, какGROUP BY ROLLUP((itemid),(proddte))
). Демонстрация на SEDEGROUP BY ROLLUP
менее запутанным, но это довольно субъективно. Я также всегда нервничаю , когда я читаю такие вещи , какThe non-ISO compliant WITH ROLLUP, WITH CUBE, and ALL syntax is deprecated
- почему я склоняюсь в пользуGROUPING SETS
.Это также правильный синтаксис:
Это немного сбивает с толку, когда вы видите это сначала, но вам нужно только помнить, что оконные функции - например,
sum() over ()
- применяются после того, какgroup by
все, что может появиться в списке выбора группы по запросу, может быть помещено в агрегат окна. Так (qty
не может, но)sum(qty)
может быть размещен внутриsum() over ()
:Сказав это, я бы предпочел
GROUPING SETS
запрос, предоставленный Аароном Бертраном. Общая сумма должна быть показана один раз, а не в каждой строке.Также обратите внимание, что хотя сумму сумм можно использовать для вычисления общей суммы, если вы хотите получить общее количество, вам придется использовать сумму подсчетов (а не подсчет подсчетов!):
И если бы кто-то хотел получить среднее значение по всей таблице, это было бы еще сложнее:
потому что среднее значение средних не совпадает со средним по всем. (Если вы попробуете,
avg(avg(qty)) over ()
вы увидите, что он может дать результат, отличный от указанного выше среднего показателя.)источник
Один из возможных способов - обернуть первый
GROUP BY
в CTE :источник