SQL SUBTRA?ÃO ENTRE COLUNAS

SINCLAIR 12/11/2014 22:44:41
#442466
Prezados,

a Query abaixo funciona uma beleza, mas gostaria de colocar a diferença entre as colunas qtd_saida e qtd_entrada e não estou conseguindo. Não sei se é cansaço, estafa, velhice da idade que chegou... fato é que não estou conseguindo coisa básica.

Eis a Query:

 select 
upper(Produtos.descricaocompleta) as descricao_completa,

(select coalesce(sum(Itens.qtd),0) as qtd_saida
from esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
where (VendasCompras.flentradasaida=[ô]S[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and
(Itens.identregproduto=Produtos.identreg) and (Itens.codemp=50)
),

(select coalesce(sum(Itens.qtd),0) as qtd_entrada
from esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
where (VendasCompras.flentradasaida=[ô]E[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and
(Itens.identregproduto=Produtos.identreg) and (Itens.codemp=50)
)
from
esprodserv as Produtos
order by
descricao_completa


O resultado vem corretamente, algo como:

Descricao_completa Qtd_saida Qtd_entrada
0721727 FONTE ATX 500W 204PINOS JITEKNILKO 0 3.000
1N CARTUCHO DE TINTA CZ104AB HP 662 TRI-COLOR 2,0 ML 3.000 0

Só queria colocar uma quarta coluna com a diferença e estou até agora quase 23:00 horas apanhando igual cavalo de carroça. é a velhice. Só pode.

Grato a todos.
FILMAN 13/11/2014 01:59:18
#442468
Resposta escolhida
Não sei dizer qual o baco está usando, portanto estou me baseando em SQL Server.

Segue query

SELECT 
PROD.IDENTREG,
UPPER(PROD.DESCRICAOCOMPLETA) AS DESCRICAO_COMPLETA,
COALESCE(SUM(
CASE
WHEN TAB.FLENTRADASAIDA = [ô]S[ô] THEN TAB.QUANTIDADE
ELSE 0
END
), 0) AS QTD_SAIDA,
COALESCE(SUM(
CASE
WHEN TAB.FLENTRADASAIDA = [ô]E[ô] THEN TAB.QUANTIDADE
ELSE 0
END
), 0) AS QTD_ENTRADA,
COALESCE(SUM(
CASE
WHEN TAB.FLENTRADASAIDA = [ô]E[ô] THEN TAB.QUANTIDADE
ELSE (TAB.QUANTIDADE * -1)
END
), 0) AS DIFERENCA
FROM ESPRODSERV PROD
INNER JOIN (
SELECT
VC.DTEMISSAO, I.CODEMP, I.IDENTREGPRODUTO, VC.FLENTRADASAIDA, COALESCE(SUM(I.QTD), 0) AS QUANTIDADE
FROM ESVENDASCOMPRASITENS I
INNER JOIN ESVENDASCOMPRAS VC ON (VC.IDENTREG = I.IDENTREGMESTRE)
GROUP BY VC.DTEMISSAO, I.CODEMP, I.IDENTREGPRODUTO, VC.FLENTRADASAIDA
) TAB ON (TAB.IDENTREGPRODUTO = PROD.IDENTREG)
WHERE TAB.CODEMP = 50
AND TAB.DTEMISSAO BETWEEN [ô]01/01/2014[ô] AND [ô]31/12/2014[ô]
GROUP BY PROD.IDENTREG, UPPER(PROD.DESCRICAOCOMPLETA);


Fiz testes aqui e funcionou. Qualquer coisa posta ai!

Espero ter ajudado
SINCLAIR 13/11/2014 10:59:12
#442473
Amigo FILMAN,

Desculpe por ter esquecido de dizer que o BD é o PostGreSQL. Eu estava realmente muiiiiito cansado e não agia mais de forma lógica.

Sua Query funciona e encerrarei o tópico lhe pontuando novamente.

Contudo, resolvi de uma outra maneira. Bastou uma noite de bom sono para logo ao acordar resolver em 1 minuto a questão que levantei.

Fiz assim:

1) Partindo do princípio que todo select resulta uma tabela de linhas e colunas, dei um nome para o resultado (que é uma tabela, portanto pode ter um nome)
2) Selecionei novamente (com um select antes da query anterior, que passou a receber um nome para ser entendido como tabela) e assim coloquei os campos do resultado tabela, fazendo uma subtração simples entre os campos que desejava.

Ficou assim:

  select Query.descricao_completa as descricao_completa, Query.qtd_saida as total_saida, Query.qtd_entrada as total_entrada, (Query.qtd_saida - Query.qtd_entrada) as saldo
from
(select
upper(Produtos.descricaocompleta) as descricao_completa,

(select coalesce(sum(Itens.qtd),0) as qtd_saida
from esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
where (VendasCompras.flentradasaida=[ô]S[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and
(Itens.identregproduto=Produtos.identreg) and (Itens.codemp=50)
),

(select coalesce(sum(Itens.qtd),0) as qtd_entrada
from esvendascomprasitens as Itens
inner join esvendascompras as VendasCompras on (VendasCompras.identreg=Itens.identregmestre)
where (VendasCompras.flentradasaida=[ô]E[ô]) and (VendasCompras.dtemissao>=[ô]01/01/2014[ô] and VendasCompras.dtemissao<=[ô]31/12/2014[ô]) and
(Itens.identregproduto=Produtos.identreg) and (Itens.codemp=50)
)
from
esprodserv as Produtos
) as Query
order by Query.descricao_completa


Tão simples, mas o cansaço, as noites anteriores programando sem dormir, somando à privação de sono a ansiosidade de ver logo a query finalizada, resultou em que eu não conseguia o que consegui rapidamente após dormir ao menos um pouco. Vida de programador.

Grato por tudo.
Tópico encerrado , respostas não são mais permitidas