- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 9 meses atrás por
fsitja.
-
AutorPosts
-
10 de junho de 2010 às 4:55 pm #94500
eversonpiza
ParticipanteOlá amigos,
Estou fazendo um select em várias colunas e apenas duas delas são númericas, preciso que seja ‘criada’ uma linha no final do select somando o valor destas duas colunas, sem sub-totais. Tentei usar ROLLUP e CUBE mas não consegui o resultado esperado, pois eles totalizam para cada valor chave.
Segue um caso de teste do que estou falando.
create table teste_agrupamento(x1 varchar2(5), x2 varchar2(5), x3 varchar2(5), n1 number, n2 number);insert into teste_agrupamento values ('A','Y','A',1,2);
insert into teste_agrupamento values ('A','T','D',2,3);
insert into teste_agrupamento values ('B','E','U',3,4);
insert into teste_agrupamento values ('C','D','J',4,6);
insert into teste_agrupamento values ('E','A','W',5,7);
COM ROLLUP
select x1,x2,x3,sum(n1),sum(n2) from teste_agrupamento group by rollup(x1,x2,x3);X1 X2 X3 SUM(N1) SUM(N2)
----- ----- ----- ---------- ----------
A T D 2 3
A T 2 3
A Y A 1 2
A Y 1 2
A 3 5
B E U 3 4
B E 3 4
B 3 4
C D J 4 6
C D 4 6
C 4 6
E A W 5 7
E A 5 7
E 5 7
15 22
COM CUBE
select x1,x2,x3,sum(n1),sum(n2) from teste_agrupamento group by cube(x1,x2,x3);X1 X2 X3 SUM(N1) SUM(N2)
----- ----- ----- ---------- ----------
15 22
A 1 2
D 2 3
J 4 6
U 3 4
W 5 7
A 5 7
A W 5 7
D 4 6
D J 4 6
E 3 4
E U 3 4
T 2 3
T D 2 3
Y 1 2
Y A 1 2
A 3 5
A A 1 2
A D 2 3
A T 2 3
A T D 2 3
A Y 1 2
A Y A 1 2
B 3 4
B U 3 4
B E 3 4
B E U 3 4
C 4 6
C J 4 6
C D 4 6
C D J 4 6
E 5 7
E W 5 7
E A 5 7
E A W 5 7
Oq eu quero seria isso:
X1 X2 X3 N1 N2
----- ----- ----- ---------- ----------
A Y A 1 2
A T D 2 3
B E U 3 4
C D J 4 6
E A W 5 7
15 22
Vocês podem me ajudar?
Obrigado.
Everson10 de junho de 2010 às 5:57 pm #94504fsitja
ParticipanteOlá,
Obrigado por postar o código para testarmos, facilita muito! 😀
Para atender sua necessidade, dá para usar grouping sets:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
Connected as fsitjaSQL> SELECT x1, x2, x3, SUM(n1), SUM(n2)
2 FROM teste_agrupamento
3 GROUP BY GROUPING SETS ((x1, x2, x3),());X1 X2 X3 SUM(N1) SUM(N2)
A T D 2 3
A Y A 1 2
B E U 3 4
C D J 4 6
E A W 5 7
15 226 rows selected
10 de junho de 2010 às 6:05 pm #94506eversonpiza
ParticipanteOlá,
Eu que agradeço a ajuda, funcionou perfeitamente. 😀
Obrigado.
10 de junho de 2010 às 6:05 pm #94507burga
Participanteisso deve resolver…
select * from (select x1,x2,x3,n1,n2 from teste_agrupamento
union all
select null, null, null, sum(n1), sum(n2) from teste_agrupamento)
order by 4;edit:
atrasei… 😆
10 de junho de 2010 às 6:56 pm #94512fsitja
Participante[quote=”burga”:1c49agdh]isso deve resolver…
select * from (select x1,x2,x3,n1,n2 from teste_agrupamento
union all
select null, null, null, sum(n1), sum(n2) from teste_agrupamento)
order by 4;edit:
atrasei… 😆 [/quote]
hehe, é apenas outra forma de pedir a mesma coisa pro Oracle 😉
No link abaixo dos Docs:
http://download.oracle.com/docs/cd/E118 … #DWHSG8631GROUPING SETS Syntax
GROUPING SETS syntax lets you define multiple groupings in the same query. GROUP BY computes all the groupings specified and combines them with “UNION ALL”. For example, consider the following statement:
GROUP BY GROUPING sets (channel_desc, calendar_month_desc, country_id )
This statement is equivalent to:
GROUP BY channel_desc “UNION ALL”
GROUP BY calendar_month_desc “UNION ALL” GROUP BY country_idA diferença é que o Grouping Sets vai fazer um único scan na tabela, sendo um pouco mais eficiente.
Quanto ao uso de rollup, pode ser feito também para chegar no resultado, mas, de novo, o desempenho vai ser inferior pois ele vai calcular os subtotais ao longo de todas dimensões para depois descartá-los no having:
SQL> SELECT x1, x2, x3, SUM(n1), SUM(n2)
2 FROM teste_agrupamento
3 GROUP BY ROLLUP (x1, x2, x3)
4 HAVING GROUPING(x1) + GROUPING(x2) + GROUPING(x3) = 0
5 OR GROUPING(x1) + GROUPING(x2) + GROUPING(x3) = 3;X1 X2 X3 SUM(N1) SUM(N2)
A T D 2 3
A Y A 1 2
B E U 3 4
C D J 4 6
E A W 5 7
15 226 rows selected
edit: o fórum dá erro quando tento postar as palavras “UNION ALL” sem as aspas.
-
AutorPosts
- Você deve fazer login para responder a este tópico.