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

Maicon Scapatici

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
 

Ricardo Pestana

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:
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:
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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar