Eu vi alguns conselhos, mas quero saber a melhor maneira de selecionar um grupo, total de grupo, total geral de uma tabela de dados SEM usar uma subconsulta ou junção desnecessária.
Meu pensamento inicial foi algo assim:
select product_family,
sum(widgets),
sum(widgets) over ()
from table.widget
group by product_family
ou o seguinte:
select product_family,
sum(widgets),
sum(widgets) over (partition by all_field)
from table.widget
group by product_family
Obviamente nenhum desses trabalhos. Eu sei que uma partição pode ser de uma ordem mais alta do que as linhas/grupos reais, mas não como particionar por "todos" além de deixá-lo em branco como o primeiro exemplo. No entanto, rompe com o grupo por afirmação.
O melhor que consigo encontrar é algo assim:
select product_family,
family_sum,
sum(family_sum) over () as grand_sum
from (
select product_family, sum(widgets)
from table.widget
group by product_family
) as A
Isso ainda envolve uma subconsulta, o que é bom. Eu apenas sinto que estou perdendo uma função fácil aqui.
GROUP BY ROLLUP
faz o que você quer.Como um exemplo:
Isso produz a seguinte saída:
O
NULL
mostrado nas duas primeiras colunas representa os valores de roll-up.Para torná-lo "bonito", você pode usar algumas substituições para os
NULL
valores acumulados:GROUP BY ROLLUP
ou - ainda melhor -GROUP BY GROUPING SETS
é melhor se você quiser uma linha adicional com o total geral.Se você deseja o total geral em cada linha - em outra coluna - sua consulta precisa de um pequeno ajuste. Você pode usar o agregado
SUM(widgets)
em uma função de janela: