SQL UNION

SINCLAIR 08/11/2014 20:58:54
#442377
Prezados,

Tenho um coluna em uma tabela chamada [Ô]flentradasaida[Ô] que contém E para entradas ou S para saídas. Uso o comando SQL abaixo e obtenho o resultado correto, logo após a query.

select
sum(Itens.vlricmsst+Itens.vlricmsst60) as soma_icms_st_entrada, Enderecos.uf
from
esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
inner join zxcadgrl as Cadastros on (Cadastros.identreg=VendasCompras.identregclifor)
inner join zxcadgrlenderecos as Enderecos on (Enderecos.identregcadastro=Cadastros.identreg)
where
(VendasCompras.codemp=50) and (VendasCompras.flentradasaida=[ô]E[ô]) and (VendasCompras.snexcluido=[ô]N[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and (Enderecos.fltipoendereco=1) and (Itens.vlricmsst>0 or Itens.vlricmsst60>0)
group by
Enderecos.uf
order by
Enderecos.uf


RESULTADO:

soma_icms_st_entrada uf
77.55 MG
763.21 PR
123.01 RJ
416.20 RS
25.89 SP

Comando funcionou corretamente para as entradas (no where está and (VendasCompras.flentradasaida=[ô]E[ô]) , logo fez corretamente a soma de ICMS ST para cada UF em que houve icms st.

Eu poderia fazer outra consulta, trocando and (VendasCompras.flentradasaida=[ô]E[ô]) por and (VendasCompras.flentradasaida=[ô]S[ô]) de forma a ter a soma das saídas de icms st por UF.

Mas eu gostaria de no mesmo select ter isto, ficaria algo como...

soma_icms_st_entrada soma_icms_st_saida uf
77.55 0.00 MG
763.21 12.13 PR
123.01 0.00 RJ
416.20 0.00 RS
25.89 0.00 SP

Acredito que seria UNION ou UNION ALL para unir os 2 selects. Mas não teve jeito de eu conseguir.

Alguma ideia, colegas?
ELUCIMAR 09/11/2014 10:33:19
#442378
Resposta escolhida
Criei duas variáveis Table no Sql Server só para fazer os testes, mais pode ser usado com as suas tabelas com join.

declare @TabSaida table
(
ValorIcms decimal(18,2),
Uf varchar(2)
)
Insert into @TabSaida(ValorIcms,Uf)
Values
([ô]10.80[ô],[ô]GO[ô]),
([ô]50.90[ô],[ô]GO[ô]),
([ô]100.40[ô],[ô]SP[ô]),
([ô]200.50[ô],[ô]SP[ô]),
([ô]30.10[ô],[ô]SP[ô]),
([ô]360.50[ô],[ô]RS[ô]),
([ô]99.40[ô],[ô]RS[ô])


declare @TabEntrada table
(
ValorIcms decimal(18,2),
Uf varchar(2)
)
Insert into @TabEntrada(ValorIcms,Uf)
Values
([ô]10.80[ô],[ô]BA[ô]),
([ô]70.90[ô],[ô]GO[ô]),
([ô]400.80[ô],[ô]BA[ô]),
([ô]20.10[ô],[ô]SP[ô]),
([ô]13.20[ô],[ô]RS[ô]),
([ô]19.80[ô],[ô]GO[ô])

--Você pode usar desta forma que ira funcionar praticamente em todos Bancos de dados
Select Sum(ValorIcms)TotalIcmsSaida, 0 as TotalIcmsEntrada,Uf
From @TabSaida
Group by Uf
Union All
Select 0 as TotalIcmsSaida, Sum(ValorIcms) as TotalIcmsEntrada,Uf
From @TabEntrada
Group by Uf

--Se seu banco for Sql Server você pode usar uma Sub Consulta como esta do Exemplo.
--*** OBS: Não testei em outros Bancos de dados esta sub Consulta.
Select
Sum(Query.TotalIcmsSaida)TotalIcmsSaida,
Sum(Query.TotalIcmsEntrada)TotalIcmsEntrada,
Uf
From
(
Select Sum(ValorIcms)TotalIcmsSaida, 0 as TotalIcmsEntrada,Uf
From @TabSaida
Group by Uf
Union All
Select 0 as TotalIcmsSaida, Sum(ValorIcms) as TotalIcmsEntrada,Uf
From @TabEntrada
Group by Uf
)as Query
Group By Uf
SINCLAIR 10/11/2014 10:00:36
#442386
Oi Elucimar,

Cara muito obrigado por dispor seu tempo para me ajudar.

Uso PostGreSQL.

Eu cheguei a conseguir, usando tabela temporária e jogando os dados de entrada e saída nela com as query[ô]s complexas, cheias de agrupamentos e de subselect, join[ô]s e coisas mais, depois select simples na tabela temporária, agrupando por UF. Mas ficou gambiarra(síssima).

Vou testar teus exemplos e já digo resultados.

Mais uma vez grato!
SINCLAIR 10/11/2014 10:53:11
#442388
Prezado Elucimar,

Com algumas mudanças para:

1) Adaptar à minha estrutura de tabelas
2) Usar a mesma tabela com o mesmo campo a ser somado, de acordo com a flag no campo flentradasaida

Deu certo, usando seu segundo exemplo como partida e ficando assim:

Citação:

select

sum(Query.soma_icms_st_saida) as total_icms_st_saida, sum(Query.soma_icms_st_entrada) as total_icms_st_entrada, uf

From
(
select sum(Itens.vlricmsst + Itens.vlricmsst60) as soma_icms_st_saida, 0 as soma_icms_st_entrada, Enderecos.uf as uf
from
esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
inner join zxcadgrl as Cadastros on (Cadastros.identreg=VendasCompras.identregclifor)
inner join zxcadgrlenderecos as Enderecos on (Enderecos.identregcadastro=Cadastros.identreg)
where
(VendasCompras.codemp=50) and (VendasCompras.flentradasaida=[ô]S[ô]) and (VendasCompras.snexcluido=[ô]N[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and (Enderecos.fltipoendereco=1) and (Itens.vlricmsst>0 or Itens.vlricmsst60>0)
group by Uf


Union All

select 0 as soma_icms_st_saida, sum(Itens.vlricmsst + Itens.vlricmsst60) as soma_icms_st_entrada, Enderecos.uf as uf
from
esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
inner join zxcadgrl as Cadastros on (Cadastros.identreg=VendasCompras.identregclifor)
inner join zxcadgrlenderecos as Enderecos on (Enderecos.identregcadastro=Cadastros.identreg)
where
(VendasCompras.codemp=50) and (VendasCompras.flentradasaida=[ô]E[ô]) and (VendasCompras.snexcluido=[ô]N[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and (Enderecos.fltipoendereco=1) and (Itens.vlricmsst>0 or Itens.vlricmsst60>0)
group by Uf

)
as Query

group by uf
order by uf



Funcionou, graças à sua ajuda.

Muito obrigado.

Vou encerrar o tópico e pontuar.

Tudo de bom.
Tópico encerrado , respostas não são mais permitidas