Usuário com melhor resposta
Trazer registro que não existe

Pergunta
-
Bom dia!
Estou precisando fazer uma consulta que me traga um registro que não existe.
Explicar melhor o que estou fazendo ...
Tenho uma tabela que contém os registros do saldo de minhas contas contábeis e para cada lançamento no meu tipo de conta 1 existe o mesmo lançamento com o mesmo valor no meu tipo de conta 3.
Acontece que algumas vezes existe esse lançamento no tipo 1 e nao existe no tipo 3.
Preciso fazer uma consulta que me traga quais são esses registros do tipo 1 que não existe no tipo de conta 3.
Tentei montar a estrutura da seguinte forma porém não funcionou:
SELECT FILIAL, DATA, LOTE, DOC, CT_DEBITO, TP_SALD, CT_CREDITO, SUM(CONVERT(DECIMAL(28, 2), VALOR)) AS SOMA FROM CT2010 AS C WHERE (DATA >= '20160101') AND (TP_SALD = 1) AND (D_E_L_E_T_ <> '*') and (C.CT_CREDIT LIKE '3%' OR C.CT_DEBITO LIKE '3%') GROUP BY FILIAL, DATA, LOTE, DOC, CT_DEBITO, TP_SALD, CT_CREDIT HAVING (SUM(CONVERT(DECIMAL(28, 2), CT2_VALOR)) <> (SELECT SUM(CONVERT(DECIMAL(28, 2), VALOR)) AS Expr1 FROM dadosadv10.dbo.CT2010 AS D WHERE (TP_SALD = 3) AND (D_E_L_E_T_ <> '*') AND (DATA = C.DATA) AND (FILIAL = C.FILIAL) AND (LOTE = C.LOTE) AND (DOC = C.DOC) AND (CT_DEBITO = C.CT_DEBITO) AND (CT_CREDIT = C.CT_CREDIT)))
Alguem poderia me ajudar com essa estrutura?
Preciso trazer registros do tipo conta = 1 que ao ser somado nao existe ou não bate com o valor da soma do tipo conta 3
Respostas
-
Bom dia,
Carine, acredito que com a consulta abaixo seja possível obter também eventuais casos onde exista o tipo 3 e não exista o tipo 1, além dos casos que você citou:
SELECT FILIAL, DATA, LOTE, DOC, CT_DEBITO, CT_CREDITO, SUM(case when TP_SALD = 1 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end) AS SomaTipo1, SUM(case when TP_SALD = 3 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end) AS SomaTipo3 FROM CT2010 AS C WHERE (DATA >= '20160101') AND (D_E_L_E_T_ <> '*') and (C.CT_CREDIT LIKE '3%' OR C.CT_DEBITO LIKE '3%') GROUP BY FILIAL, DATA, LOTE, DOC, CT_DEBITO, CT_CREDIT HAVING SUM(case when TP_SALD = 1 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end) <> SUM(case when TP_SALD = 3 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end)
Caso você queira retornar somente os casos onde existe o tipo 1 e não existe o tipo 3 experimente adicionar o trecho abaixo no Having da consulta acima:
AND MIN(TP_SALD) = 1
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta carine.couto segunda-feira, 24 de outubro de 2016 13:41
Todas as Respostas
-
Bom dia,
Carine, acredito que com a consulta abaixo seja possível obter também eventuais casos onde exista o tipo 3 e não exista o tipo 1, além dos casos que você citou:
SELECT FILIAL, DATA, LOTE, DOC, CT_DEBITO, CT_CREDITO, SUM(case when TP_SALD = 1 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end) AS SomaTipo1, SUM(case when TP_SALD = 3 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end) AS SomaTipo3 FROM CT2010 AS C WHERE (DATA >= '20160101') AND (D_E_L_E_T_ <> '*') and (C.CT_CREDIT LIKE '3%' OR C.CT_DEBITO LIKE '3%') GROUP BY FILIAL, DATA, LOTE, DOC, CT_DEBITO, CT_CREDIT HAVING SUM(case when TP_SALD = 1 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end) <> SUM(case when TP_SALD = 3 then CONVERT(DECIMAL(28, 2), VALOR) else 0 end)
Caso você queira retornar somente os casos onde existe o tipo 1 e não existe o tipo 3 experimente adicionar o trecho abaixo no Having da consulta acima:
AND MIN(TP_SALD) = 1
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta carine.couto segunda-feira, 24 de outubro de 2016 13:41
-
uma das possíveis soluções seria dividir para conquistar
1) criar um select ou uma tabela temporária com o tipo 1
2)criar um select ou uma tabela temporária com o tipo 3
fazer a query final ou com um NOT Exists ou com um Except
Wesley Neves
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 25 de outubro de 2016 12:49
-