romulo
General de Pijama
Registrado
7.4K Mensagens
0 Curtidas
Hmmm, não entendi direito. Você pode mostrar a consulta SQL pra ilustrar melhor?
renatamiyagu...
Membro Junior
Registrado
102 Mensagens
0 Curtidas
Oi! A consulta é a seguinte:
SELECT ht.dt_geracao_arquivo AS "01_Data_Geracao_Arquivo",
mpa.dt_movimento AS "02_Data_Geracao",
SUM(mpa.vl_repasse) AS "03_Valor_Geracao",
lp.dt_lancamento AS "04_Data_Extrato",
SUM(lp.vl_lancamento) AS "05_Valor_Extrato",
SUM(mpa.vl_repasse - lp.vl_lancamento)AS "06_Diferenca",
FROM arf_movimento_prov_arrec mpa LEFT OUTER JOIN arf_ht_arrec_ic ht ON (mpa.id_ht_arrec_ic = ht.id_ht_arrec_ic) FULL OUTER JOIN arf_lancamento_prov lp ON (ht.prov_cd_cpfcgc = lp.prov_cd_cpfcgc)
WHERE ht.prov_cd_cpfcgc = 11111111111111::numeric
AND ht.tp_a_prestacao_contas <> 1::numeric
AND ht.dt_geracao_arquivo >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND ht.dt_geracao_arquivo <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND mpa.tp_movimento = 0::numeric
AND lp.prov_cd_cpfcgc = 11111111111111::numeric
AND lp.tp_lancamento = 0::numeric
AND lp.dt_lancamento >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND lp.dt_lancamento <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
GROUP BY "01_Data_Geracao_Arquivo", "02_Data_Geracao", "04_Data_Extrato"
ORDER BY "01_Data_Geracao_Arquivo";
As condições "ht.prov_cd_cpfcgc = 11111111111111::numeric" e "lp.prov_cd_cpfcgc = 11111111111111::numeric" podem ou não ser verdadeiras, e o que pega aí é que as duas tabelas são linkadas por esse campo apenas. Existe algo que torne essas condições não-obrigatórias?
Estou vendo uma outra maneira de fazer isso, usando UNION, mas esse tipo de select é muito lento.
romulo
General de Pijama
Registrado
7.4K Mensagens
0 Curtidas
Putz, que consulta grande... Vou dar uma analisada...
romulo
General de Pijama
Registrado
7.4K Mensagens
0 Curtidas
Oops... Demorei mas dei uma olhada...
Bem, creio que se você testar a possibilidade de não existência, dará certo, tipo:
WHERE
(ht.prov_cd_cpfcgc = 11111111111111::numeric OR ht.prov_cd_cpfcgc is null)
AND ht.tp_a_prestacao_contas <> 1::numeric
AND ht.dt_geracao_arquivo >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND ht.dt_geracao_arquivo <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND mpa.tp_movimento = 0::numeric
AND (lp.prov_cd_cpfcgc = 11111111111111::numeric OR lp.prov_cd_cpfcgc is null)
AND lp.tp_lancamento = 0::numeric
AND lp.dt_lancamento >= TO_TIMESTAMP('13/11/2000 00:00:00','DD/MM/YYYY HH24:MI:SS')
AND lp.dt_lancamento <= TO_TIMESTAMP('14/11/2002 00:00:00','DD/MM/YYYY HH24:MI:SS')
Tome cuidado também com a expressão SUM(mpa.vl_repasse - lp.vl_lancamento)AS "06_Diferenca", pois como os dois campos podem ser nulos (ao mesmo tempo ou não), o resultado poderá ser um nulo também, já que qualquer operação matemática realizada com um nulo dá nulo (a não ser que no PostgreSQL seja diferente dos outros BDs).
renatamiyagu...
Membro Junior
Registrado
102 Mensagens
0 Curtidas
Bom dia...
Haviam alguns outros detalhes do relatório que seria impossível obter em um único select. Acabei optando por fazer inserts em uma tabela temporária e depois o cursor faz um simples select nela. Só assim funcionou.
Sobre os valores nulos, realmente o que vc falou acontece. No PostgreSQL existe um função chamada COALESCE que funciona como o NVL do Oracle.
De qualquer forma, muito obrigada pela ajuda!! Valeu mesmo!
Renata