SQL UNION
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?
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
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!
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.