Array
(
)

Ajuda com Query complicada

Jaime Daltoe
   - 08 ago 2013

Boa Tarde!
Desejo criar uma query, que some por mes, o valor do faturamento interno e o externo (campo VLRCTB) , sabendo-se que o que define se é interno ou externo são os CODTNS, no caso os de codigo 7102 e 7106 são faturamento externo. Eu fiz o exemplo abaixo:
SELECT sum(E660NFV.VLRCTB) as vMInterno, month(datemi) as mes ,max(datemi) as newDAta \
FROM E660NFV
WHERE E660NFV.CODEMP = :ECodEmp AND
E660NFV.CODFIL < 99 AND
E660NFV.DATEMI >= :eDatIni AND
E660NFV.DATEMI <= :eDatFim AND
CODTNS IN (''5102S'',''5102'',''5106'',''5106S'',''6102'',''6102S'',''5949'',''5124'',''5124A'',''6106S'',''6106'')
group by month(datemi) union
SELECT sum(E660NFV.VLRCTB) as vMExterno, month(datemi) as mes ,max(datemi) as newDAta \
FROM E660NFV
WHERE E660NFV.CODEMP = :ECodEmp AND
E660NFV.CODFIL < 99 AND
E660NFV.DATEMI >= :eDatIni AND
E660NFV.DATEMI <= :eDatFim AND
CODTNS IN (''7102S'',''7102'',''7106'',''7106S'')
group by month(datemi)
que me retorna:
vMInterno mes newDAta
-------------- ---------- -----------------
1146205.10 4 2013-04-25 00:00:00.000
1875919.80 5 2013-05-29 00:00:00.000
10209870.92 5 2013-05-31 00:00:00.000
11224638.86 4 2013-04-30 00:00:00.000
Acredito que esteja correto, mas eu queria uma quarta coluna pro vMExterno.

Flavix
   - 08 ago 2013

Jaime,

Passa por favor a estrutura da sua tabela, assim fica mais fácil lhe ajudarmos.

Atenciosamente,

Jaime Daltoe
   - 09 ago 2013

Eu quero valores do mesmo campo, no mesmo select, porém, quando as vendas são internas, os códigos são ''5102S'',''5102'',''5106'',''5106S'',''6102'',''6102S'',''5949'',''5124'',''5124A'',''6106S'',''6106' e quando as vendas são externas os códigos são ''7102S'',''7102'',''7106'',''7106S'' e além disso, deve haver a coluna vMInterno que vai trazer o valor mensal da venda interna e o vMExterno com a venda externa.

David Sylvestre
   - 09 ago 2013

Se entendi corretamente, basta colocar o campo que está faltando para realizar o union.
Acredito que ele não tenha funcionado por causa dos dois selects conterem estruturas diferentes.
Segue abaixo como deveria ficar.

#Código

SELECT sum(E660NFV.VLRCTB) AS vMInterno
	, month(datemi) AS mes
	, max(datemi) AS newDAta
   , 0 as vMExterno
FROM E660NFV
WHERE E660NFV.CODEMP = :ECodEmp
	AND E660NFV.CODFIL < 99
	AND E660NFV.DATEMI >= :eDatIni
	AND E660NFV.DATEMI <= :eDatFim
	AND CODTNS IN ('5102S', '5102', '5106', '5106S', '6102', '6102S', '5949', '5124', '5124A', '6106S', '6106')
GROUP BY month(datemi)

UNION

SELECT 0 AS vMInterno 
	, month(datemi) AS mes
	, max(datemi) AS newDAta
   , sum(E660NFV.VLRCTB) AS vMExterno
FROM E660NFV
WHERE E660NFV.CODEMP = :ECodEmp
	AND E660NFV.CODFIL < 99
	AND E660NFV.DATEMI >= :eDatIni
	AND E660NFV.DATEMI <= :eDatFim
	AND CODTNS IN ('7102S', '7102', '7106', '7106S')
GROUP BY month(datemi)

Alex Lekao
   - 09 ago 2013

Ola Jaime, bom dia!!!

acredito que a sugestao do David ja resolva o que vc esta querendo.

verifique e poste para a gente verificar se deu certo.

Abraco.

Alex - Lekao

Jaime Daltoe
   - 09 ago 2013

David, acertou na mosca!

Obrigado pela solução!

Abraco.