*Colega, antes de mais nada muito embora as fontes de dados sejam
diferentes com o UNION ALL vc obtém um RESULTSET ÚNICO, composto pelas tais
colunas :"Codigo Produto","Qtde Faturada","Valor s/ IPI e ST","Valor c/ IPI
e ST"certo ?? E tanto é assim que se vc meter um SELECT * FROM
(teusdoisSELECTsqueforamunidosporUNION) é ISSO que vc obterá, correto ??*
Corretíssimo Chiappa, porem caso haja exista o código do produto "ABC134"
em AMBAS as fontes de dados, o resultado final apresentará 2 linhas para o
código "ABC134".
*Então minha primeira resposta é : PASSE PARA A SUA TOOL DE RELATÓRIOS como
fonte de dados um SELECT * FROM (tuaquerycompostapelosdosiselectsunidos);
simples assim : fazendo isso a tool de reporting NEM VAI SABER que
originalmente os dados vieram de duas fontes diferentes.... AO FAZER ISSO,
vc poderá fazer somatórios normais com os recursos COMUNS de somar valores
de coluna na sua tool de report, tanto na coluna "Valor s/ IPI e ST" quanto
na coluna "Valor c/ IPI e ST" ou pra coluna "Qtde Faturada"....*
Sim, e é isso que faço. O problema é que preciso somar as 2 linhas do
produto "ABC1234" citadas acima, consolidando-as em uma linha. Não acredito
que meu gerador de relatórios (Fortes Report, para Delphi) faça isso. O que
você esta sugerindo fazer é uma totalização geral da linhas do relatório,
isso perfeitamente normal de se fazer.
*Por exemplo, tenho aqui duas queries (no caso na mesma tabela mas não
importa) unidas por um UNION ALL :scott@BD_TESTE:SQL>edGravou file
afiedt.buf 1 select deptno as "Código do Departamento", 2 ename
as "Nome do Empregado", 3 sal as "Salário do Empregado" 4 from
emp where deptno < 30 5 UNION ALL 6 select deptno as "Código do
Departamento", 7 ename as "Nome do Empregado", 8 sal as
"Salário do Empregado" 9* from emp where deptno >=
30scott@BD_TESTE:SQL>/Código do Departamento Nome do Em Salário do
Empregado---------------------- ----------
-------------------- 20 SMITH
800 20 JONES
2975 10 CLARK
2450 20 SCOTT
3000 10 KING
5000 20 ADAMS
1100 20 FORD
3000 10 MILLER
1300 30 ALLEN
1600 30 WARD
1250 30 MARTIN
1250 30 BLAKE
2850 30 TURNER
1500 30 JAMES 95014 linhas
selecionadas.scott@BD_TESTE:SQL>==> SE eu encapsular num SELECT *, eu posso
USAR NORMALMENTE as colunas geradas por cada um dos SELECTs internos como
condição de WHERE, como Ordenação, como argumento pra Totalizador na minha
tool de Reporting... Por exemplo, usando a coluna gerada "Salário do
Empregado" como parte do filtro WHERE :scott@BD_TESTE:SQL>edGravou file
afiedt.buf 1 select * 2 from ( 3 select deptno as "Código
do Departamento", 4 ename as "Nome do Empregado",
5 sal as "Salário do Empregado" 6 from emp
where deptno < 30 7 UNION ALL 8 select deptno as
"Código do Departamento", 9 ename as "Nome do
Empregado", 10 sal as "Salário do
Empregado" 11 from emp where deptno >= 30 12 ) 13*
where "Salário do Empregado" > 1000scott@BD_TESTE:SQL>/*
Perfeito Chiappa, precisaria testar, mas acredito que esse select resolva o
problema:
select "Código_do_Departamento",
"Nome_do_Empregado",
SUM("Salário_do_Empregado")
from (select deptno as "Código_do_Departamento",
ename as "Nome_do_Empregado",
sal as "Salário_do_Empregado"
from emp
where deptno < 30
UNION ALL
select deptno as "Código_do_Departamento",
ename as "Nome_do_Empregado",
sal as "Salário_do_Empregado"
from emp
where deptno >= 30)
GROUP BY "Código_do_Departamento",
"Nome_do_Empregado"
Se for possível fazer isso, acredito que o problema esta resolvido. Alias
acredito que tenhas sido essa a sugestão do colega Tercio.
Vou fazer testes aqui, e passo um feedback.................
Muito obrigado pelas sugestões.
Emerson
Emerson Sanches
Analista de Sistemas
Em 5 de fevereiro de 2018 15:07, [email protected] [oracle_br] <
[email protected]> escreveu:
>
>
> Colega, antes de mais nada muito embora as fontes de dados sejam
> diferentes com o UNION ALL vc obtém um RESULTSET ÚNICO, composto pelas tais
> colunas :
> "Codigo Produto",
> "Qtde Faturada",
> "Valor s/ IPI e ST",
> "Valor c/ IPI e ST"
>
> certo ?? E tanto é assim que se vc meter um SELECT * FROM (
> teusdoisSELECTsqueforamunidosporUNION) é ISSO que vc obterá, correto ??
> Então minha primeira resposta é : PASSE PARA A SUA TOOL DE RELATÓRIOS
> como fonte de dados um SELECT * FROM (tuaquerycompostapelosdosiselectsunidos);
> simples assim : fazendo isso a tool de reporting NEM VAI SABER que
> originalmente os dados vieram de duas fontes diferentes.... AO FAZER ISSO,
> vc poderá fazer somatórios normais com os recursos COMUNS de somar valores
> de coluna na sua tool de report, tanto na coluna "Valor s/ IPI e ST" quanto
> na coluna "Valor c/ IPI e ST" ou pra coluna "Qtde Faturada"....
>
> Por exemplo, tenho aqui duas queries (no caso na mesma tabela mas não
> importa) unidas por um UNION ALL :
>
> scott@BD_TESTE:SQL>ed
> Gravou file afiedt.buf
>
> 1 select deptno as "Código do Departamento",
> 2 ename as "Nome do Empregado",
> 3 sal as "Salário do Empregado"
> 4 from emp where deptno < 30
> 5 UNION ALL
> 6 select deptno as "Código do Departamento",
> 7 ename as "Nome do Empregado",
> 8 sal as "Salário do Empregado"
> 9* from emp where deptno >= 30
> scott@BD_TESTE:SQL>/
>
> Código do Departamento Nome do Em Salário do Empregado
> ---------------------- ---------- --------------------
> 20 SMITH 800
> 20 JONES 2975
> 10 CLARK 2450
> 20 SCOTT 3000
> 10 KING 5000
> 20 ADAMS 1100
> 20 FORD 3000
> 10 MILLER 1300
> 30 ALLEN 1600
> 30 WARD 1250
> 30 MARTIN 1250
> 30 BLAKE 2850
> 30 TURNER 1500
> 30 JAMES 950
>
> 14 linhas selecionadas.
>
> scott@BD_TESTE:SQL>
>
> ==> SE eu encapsular num SELECT *, eu posso USAR NORMALMENTE as colunas
> geradas por cada um dos SELECTs internos como condição de WHERE, como
> Ordenação, como argumento pra Totalizador na minha tool de Reporting... Por
> exemplo, usando a coluna gerada "Salário do Empregado" como parte do filtro
> WHERE :
>
> scott@BD_TESTE:SQL>ed
> Gravou file afiedt.buf
>
> 1 select *
> 2 from (
> 3 select deptno as "Código do Departamento",
> 4 ename as "Nome do Empregado",
> 5 sal as "Salário do Empregado"
> 6 from emp where deptno < 30
> 7 UNION ALL
> 8 select deptno as "Código do Departamento",
> 9 ename as "Nome do Empregado",
> 10 sal as "Salário do Empregado"
> 11 from emp where deptno >= 30
> 12 )
> 13* where "Salário do Empregado" > 1000
> scott@BD_TESTE:SQL>/
>
> Código do Departamento Nome do Em Salário do Empregado
> ---------------------- ---------- --------------------
> 20 JONES 2975
> 10 CLARK 2450
> 20 SCOTT 3000
> 10 KING 5000
> 20 ADAMS 1100
> 20 FORD 3000
> 10 MILLER 1300
> 30 ALLEN 1600
> 30 WARD 1250
> 30 MARTIN 1250
> 30 BLAKE 2850
> 30 TURNER 1500
>
> 12 linhas selecionadas.
>
> scott@BD_TESTE:SQL>
>
> ==> Simples de tudo, não tem onde errar... Um exemplo usando essa coluna
> na minha tool geradora de relatórios, que vai ser o sql*plus mesmo (mas
> praticamente TODA e QUALQUER tool de relatório DECENTE tem alguma built-in
> pra te fazer somatórios numa coluna) :
>
> scott@BD_TESTE:SQL>break on report
> scott@BD_TESTE:SQL>compute sum of "Salário do Empregado" on REPORT
>
> (De novo, estou usando o sql*plus só pra demonstrar, vc vai fazer o
> EQUIVALENTE na SUA tool de relatórios, que aliás vc não disse qual é)
>
> ==> Executando o mesmo SELECT * FROM subs, olha só a minha 'tool de
> report' fazendo uma soma em cima dessa 'coluna virtual' :
>
> scott@BD_TESTE:SQL>l
> 1 select *
> 2 from (
> 3 select deptno as "Código do Departamento",
> 4 ename as "Nome do Empregado",
> 5 sal as "Salário do Empregado"
> 6 from emp where deptno < 30
> 7 UNION ALL
> 8 select deptno as "Código do Departamento",
> 9 ename as "Nome do Empregado",
> 10 sal as "Salário do Empregado"
> 11 from emp where deptno >= 30
> 12 )
> 13* where "Salário do Empregado" > 1000
> scott@BD_TESTE:SQL>/
>
> Código do Departamento Nome do Em Salário do Empregado
> ---------------------- ---------- --------------------
> 20 JONES 2975
> 10 CLARK 2450
> 20 SCOTT 3000
> 10 KING 5000
> 20 ADAMS 1100
> 20 FORD 3000
> 10 MILLER 1300
> 30 ALLEN 1600
> 30 WARD 1250
> 30 MARTIN 1250
> 30 BLAKE 2850
> 30 TURNER 1500
> --------------------
> sum 27275
>
> 12 linhas selecionadas.
>
> scott@BD_TESTE:SQL>
>
> ==>> OKDOC ???
> Agora, se vc tá usando uma tool de relatório a mais vagal, que nem soma
> de coluna te faz, SIM, também é possível se criar uma coluna de Soma mesmo
> que não haja GROUP BY (que é o seu caso, imagino) : pra isso usaríamos
> ANALYTICS.... Se for esse o caso manda um exemplo com dados que a gente te
> faz uma Demonstração, é simples....
>
> []s
>
> Chiappa
>
>