Count replicando dados
02/10/2018
0
Bom dia! Estou implementando um relatório e no mesmo trago a contagem de dias em atraso de um título, e agora quero colocar também quantos títulos o cliente ainda tem a vencer com a empresa. Mas na hora de rodar o código ele me traz todos os dados corretamente, menos a contagem do número de títulos em aberto do cliente. Pelo que vi ele soma o de um determinado cliente e replica o mesmo valor para todos os demais. Será que alguém consegue me explicar o porque e me dar uma luz e como resolver isso? obrigado desde já!
SELECT DISTINCT * FROM (SELECT DISTINCT FIN.NUNOTA , FIN.NUMNOTA , FIN.AD_DOCUMENTO , PAR.CODPARC , PAR.RAZAOSOCIAL , TIT.DESCRTIPTIT , FIN.VLRDESDOB , CID.NOMECID , VEN.APELIDO AS VENDEDOR , FIN.DTNEG , FIN.DTVENC , FIN.VLRJURO , FIN.VLRMULTA , (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) AS "ATRASO" , GER.APELIDO SUPERVISOR FROM TGFFIN FIN, TGFPAR PAR, TGFVEN VEN, TSICID CID, TGFTIT TIT, TGFVEN GER WHERE PAR.CODVEND = VEN.CODVEND AND FIN.CODPARC = PAR.CODPARC AND PAR.CODCID = CID.CODCID AND FIN.CODTIPTIT = TIT.CODTIPTIT AND FIN.PROVISAO = 'N' AND FIN.CODTIPTIT IN TIT.CODTIPTIT AND FIN.DHBAIXA IS NULL AND GER.TIPVEND = 'S' AND GER.CODVEND = VEN.CODGER AND GER.CODGER = '65' AND DTVENC < SYSDATE -1 AND FIN.RECDESP ='1' AND (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) >= 20 ORDER BY VEN.APELIDO, PAR.RAZAOSOCIAL)VENCIDOS, (SELECT DISTINCT COUNT(FIN.DTVENC) AS "DIA" FROM TGFFIN FIN, TGFVEN VEN, TGFVEN GER, TGFPAR PAR WHERE PAR.CODVEND = VEN.CODVEND AND FIN.CODPARC = PAR.CODPARC AND FIN.PROVISAO = 'N' AND FIN.DHBAIXA IS NULL AND FIN.VLRBAIXA = 0 AND GER.TIPVEND = 'S' AND GER.CODVEND = VEN.CODGER AND GER.CODGER = '65' AND DTVENC >= SYSDATE AND FIN.RECDESP ='1' GROUP BY PAR.CODPARC )DIA
Maicon Scapatici
Curtir tópico
+ 0
Responder
Post mais votado
02/10/2018
Maicon,
Difícil de entender o seu select porque são muitos campos onde os nomes não são tão intuitivos. Mas pelo que entendi, vc quer listar todos os títulos na primeira subquery, q que esta está funcionando...bom, se for isso, talvez seja interessante fazer algo nesse sentido:
Observação: na suquery que faz a contagem, você precisa fazer o relacionamento com o "cliente" (ou chave) do select mais externo (tabela1) para que não retorne o mesmo valor para todas as linhas. Abaixo, para ilustrar eu coloquei o campo "FIN.CODPARC" como sendo essa chave, mas vc precisa analisar suas tabelas aí... outra observação, tire do seu select as tabelas que não são necessárias...
SELECT tabela1.*,
(SELECT DISTINCT COUNT(FIN.DTVENC) AS "DIA" FROM TGFFIN FIN, TGFVEN VEN, TGFVEN GER, TGFPAR PAR
WHERE PAR.CODVEND = VEN.CODVEND
AND FIN.CODPARC = TABELA1.CODPARC
AND FIN.PROVISAO = 'N'
AND FIN.DHBAIXA IS NULL
AND FIN.VLRBAIXA = 0
AND GER.TIPVEND = 'S'
AND GER.CODVEND = VEN.CODGER
AND GER.CODGER = '65'
AND DTVENC >= SYSDATE
AND FIN.RECDESP ='1'
GROUP BY PAR.CODPARC
)DIA
FROM
(SELECT DISTINCT FIN.NUNOTA
, FIN.NUMNOTA
, FIN.AD_DOCUMENTO
, PAR.CODPARC
, PAR.RAZAOSOCIAL
, TIT.DESCRTIPTIT
, FIN.VLRDESDOB
, CID.NOMECID
, VEN.APELIDO AS VENDEDOR
, FIN.DTNEG
, FIN.DTVENC
, FIN.VLRJURO
, FIN.VLRMULTA
, (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) AS "ATRASO"
, GER.APELIDO SUPERVISOR
FROM TGFFIN FIN, TGFPAR PAR, TGFVEN VEN, TSICID CID, TGFTIT TIT, TGFVEN GER
WHERE PAR.CODVEND = VEN.CODVEND
AND FIN.CODPARC = PAR.CODPARC
AND PAR.CODCID = CID.CODCID
AND FIN.CODTIPTIT = TIT.CODTIPTIT
AND FIN.PROVISAO = 'N'
AND FIN.CODTIPTIT IN TIT.CODTIPTIT
AND FIN.DHBAIXA IS NULL
AND GER.TIPVEND = 'S'
AND GER.CODVEND = VEN.CODGER
AND GER.CODGER = '65'
AND DTVENC < SYSDATE -1
AND FIN.RECDESP ='1'
AND (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) >= 20
ORDER BY VEN.APELIDO, PAR.RAZAOSOCIAL)VENCIDOS)
as tabela 1
Difícil de entender o seu select porque são muitos campos onde os nomes não são tão intuitivos. Mas pelo que entendi, vc quer listar todos os títulos na primeira subquery, q que esta está funcionando...bom, se for isso, talvez seja interessante fazer algo nesse sentido:
Observação: na suquery que faz a contagem, você precisa fazer o relacionamento com o "cliente" (ou chave) do select mais externo (tabela1) para que não retorne o mesmo valor para todas as linhas. Abaixo, para ilustrar eu coloquei o campo "FIN.CODPARC" como sendo essa chave, mas vc precisa analisar suas tabelas aí... outra observação, tire do seu select as tabelas que não são necessárias...
SELECT tabela1.*,
(SELECT DISTINCT COUNT(FIN.DTVENC) AS "DIA" FROM TGFFIN FIN, TGFVEN VEN, TGFVEN GER, TGFPAR PAR
WHERE PAR.CODVEND = VEN.CODVEND
AND FIN.CODPARC = TABELA1.CODPARC
AND FIN.PROVISAO = 'N'
AND FIN.DHBAIXA IS NULL
AND FIN.VLRBAIXA = 0
AND GER.TIPVEND = 'S'
AND GER.CODVEND = VEN.CODGER
AND GER.CODGER = '65'
AND DTVENC >= SYSDATE
AND FIN.RECDESP ='1'
GROUP BY PAR.CODPARC
)DIA
FROM
(SELECT DISTINCT FIN.NUNOTA
, FIN.NUMNOTA
, FIN.AD_DOCUMENTO
, PAR.CODPARC
, PAR.RAZAOSOCIAL
, TIT.DESCRTIPTIT
, FIN.VLRDESDOB
, CID.NOMECID
, VEN.APELIDO AS VENDEDOR
, FIN.DTNEG
, FIN.DTVENC
, FIN.VLRJURO
, FIN.VLRMULTA
, (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) AS "ATRASO"
, GER.APELIDO SUPERVISOR
FROM TGFFIN FIN, TGFPAR PAR, TGFVEN VEN, TSICID CID, TGFTIT TIT, TGFVEN GER
WHERE PAR.CODVEND = VEN.CODVEND
AND FIN.CODPARC = PAR.CODPARC
AND PAR.CODCID = CID.CODCID
AND FIN.CODTIPTIT = TIT.CODTIPTIT
AND FIN.PROVISAO = 'N'
AND FIN.CODTIPTIT IN TIT.CODTIPTIT
AND FIN.DHBAIXA IS NULL
AND GER.TIPVEND = 'S'
AND GER.CODVEND = VEN.CODGER
AND GER.CODGER = '65'
AND DTVENC < SYSDATE -1
AND FIN.RECDESP ='1'
AND (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) >= 20
ORDER BY VEN.APELIDO, PAR.RAZAOSOCIAL)VENCIDOS)
as tabela 1
Ricardo Pestana
Responder
Mais Posts
03/10/2018
Maicon Scapatici
Bom dia! Tentei com a sua sugestão mas não funcionou, da mesma maneira ele replica os dados. vou tentar reescrever o código aqui nas respostas pra deixar um pouco mais claro o que ele faz. Mas como dito este relatório ele traz Por Supervisor > Seus vendedores > seus clientes com débitos> titulos vencidos desses clientes. O que eu precisava fazer era trazer além dessas informações, também o numero de títulos que se encontram em dia desses mesmos clientes.
Trazer Supervisor>Vendedor>Cliente>Titulos com Pagamento em Aberto:
Junto com esse código eu precisaria implementar o contador de Títulos sem atraso:
Espero ter ficado mais fácil de entender rsrs.
Trazer Supervisor>Vendedor>Cliente>Titulos com Pagamento em Aberto:
SELECT FIN.NUNOTA --Número unico da nota de venda da tabela financeiro(primario) , FIN.NUMNOTA -- numero da nota de venda (sequencial) , PAR.CODPARC --código do cliente , PAR.RAZAOSOCIAL -- razão social do cliente , TIT.DESCRTIPTIT -- descrição do tipo de título , FIN.VLRDESDOB -- valor total do título , CID.NOMECID -- nome da cidade do cliente , VEN.APELIDO AS VENDEDOR -- nome do vendedor , FIN.DTNEG -- data da negociação , FIN.DTVENC -- data do vencimento do título , FIN.VLRJURO - valor dos juros , FIN.VLRMULTA -- valor da multa , (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) AS "ATRASO" -- mostrar numero de dias atrasados , GER.APELIDO SUPERVISOR -- nome do supervisor , GER.CODGER -- código do supervisor FROM TGFFIN FIN, TGFPAR PAR, TGFVEN VEN, TSICID CID, TGFTIT TIT, TGFVEN GER --(fin > tabela financeiro par> tabela cliente ven>tabela vendedor cid> --tabela cidade tit> tabela título ger> tabela supervisor WHERE PAR.CODVEND = VEN.CODVEND AND FIN.CODPARC = PAR.CODPARC AND PAR.CODCID = CID.CODCID AND FIN.CODTIPTIT = TIT.CODTIPTIT AND FIN.PROVISAO = 'N' AND FIN.CODTIPTIT IN TIT.CODTIPTIT AND FIN.DHBAIXA IS NULL --dhbaixa Data e hora da baixa AND GER.TIPVEND = 'S' -- tipvend saber se é R representante ou S supervisor AND GER.CODVEND = VEN.CODGER AND GER.CODGER = $P -- variável do iReport pra receber o código do gerente AND DTVENC < SYSDATE -1 AND FIN.RECDESP ='1' -- receita ou despesa 1 = venda AND (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) >= $P ORDER BY VEN.APELIDO, PAR.RAZAOSOCIAL
Junto com esse código eu precisaria implementar o contador de Títulos sem atraso:
SELECT DISTINCT COUNT(FIN.DTVENC) FROM TGFPAR PAR, TGFFIN FIN, TGFVEN GER, TGFVEN VEN WHERE PAR.CODVEND = VEN.CODVEND AND FIN.CODPARC = PAR.CODPARC AND FIN.PROVISAO = 'N' AND GER.TIPVEND = 'S' AND GER.CODGER = 65 AND FIN.RECDESP ='1' AND FIN.CODTIPOPERBAIXA =0
Espero ter ficado mais fácil de entender rsrs.
Responder
03/10/2018
Maicon Scapatici
Dei uma estudada melhor na sua sugestão, e descobri que eu estava efetuando a comparação errada, por isso a replicação dos dados. Segui novamente sua sugestão em uma nova tentativa e obtive o resultado esperado! Muito obrigado!
Segue Resultado:
Segue Resultado:
SELECT DISTINCT* FROM (SELECT DISTINCT FIN.NUNOTA , FIN.NUMNOTA , FIN.AD_DOCUMENTO , PAR.CODPARC AS "CODPARC" , PAR.RAZAOSOCIAL , TIT.DESCRTIPTIT , FIN.VLRDESDOB , CID.NOMECID , VEN.APELIDO AS VENDEDOR , FIN.DTNEG , FIN.DTVENC , FIN.VLRJURO , FIN.VLRMULTA , (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) AS "ATRASO" , GER.APELIDO SUPERVISOR , GER.CODGER FROM TGFFIN FIN, TGFPAR PAR, TGFVEN VEN, TSICID CID, TGFTIT TIT, TGFVEN GER WHERE PAR.CODVEND = VEN.CODVEND AND FIN.CODPARC = PAR.CODPARC AND PAR.CODCID = CID.CODCID AND FIN.CODTIPTIT = TIT.CODTIPTIT AND FIN.PROVISAO = 'N' AND FIN.CODTIPTIT IN TIT.CODTIPTIT AND FIN.DHBAIXA IS NULL AND GER.TIPVEND = 'S' AND GER.CODVEND = VEN.CODGER AND GER.CODGER = 65 AND DTVENC < SYSDATE -1 AND FIN.RECDESP ='1' AND (TO_DATE(SYSDATE,'dd/mm/yy') - FIN.DTVENC) >= 20 ORDER BY VEN.APELIDO, PAR.RAZAOSOCIAL)VENCIDO, (SELECT DISTINCT PAR.CODPARC AS "CODPARC", COUNT(FIN.DTVENC) FROM TGFPAR PAR, TGFFIN FIN, TGFVEN GER, TGFVEN VEN WHERE PAR.CODVEND = VEN.CODVEND AND FIN.CODPARC = PAR.CODPARC AND FIN.PROVISAO = 'N' AND GER.TIPVEND = 'S' AND GER.CODGER = '65' AND FIN.RECDESP ='1' AND FIN.CODTIPOPERBAIXA ='0' GROUP BY PAR.CODPARC )DIA WHERE VENCIDO."CODPARC"=DIA."CODPARC"
Responder
Clique aqui para fazer login e interagir na Comunidade :)