Mostrar linhas do Group By que não existem

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
raphaelias
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Seg, 28 Abr 2008 1:51 pm
Localização: São Bernardo do Campo - SP

Boa tarde pessoal,

minha dúvida é a seguinte, tenho uma tabela PAGAMENTO com o campo data, valor e grupo.

Quero fazer um comparativo entre duas datas de quanto foi pago em cada uma.

Então minha select ficou:

SELECT data, grupo, SUM(valor)
WHERE grupo=1 AND data IN ('data1','data2')
GROUP BY data, grupo

Porém se na data 2 não houver nenhum pagamento, não trará linha de resultado.

Como faço para mostrar uma linha com data, grupo e valor = 0??

Um abraço e obrigado à todos!!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Acho que uma forma de fazer isso é fazer um UNION ALL do seu select com um outro que tenha todas datas e valor ZERO. Depois disso, fazer o GROUP BY.

Algo assim:

Selecionar tudo

SELECT data, grupo, SUM(valor)
FROM
  (
  SELECT data, grupo, valor
  FROM TABELA
  WHERE grupo=1 
    AND data >= 'data1'
    AND data <= 'data2'

  UNION ALL

  SELECT TRUNC(SYSDATE) + ROWNUM-1, 1 grupo, 0
  FROM ALL_OBJECTS
  WHERE TRUNC(SYSDATE) + ROWNUM-1 >= 'data1'
    and TRUNC(SYSDATE) + ROWNUM-1 <= 'data2'
  )
GROUP BY data, grupo 
Eu não testei aqui se funciona, mas acho que é uma idéia. (neste caso, ele está pegando uma FAIXA de data, de data1 até data2.

:-o
raphaelias
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Seg, 28 Abr 2008 1:51 pm
Localização: São Bernardo do Campo - SP

Thomas,

Essa não é uma boa maneira pois não serão apenas 2 datas como no exemplo, mas serão quantas o usuário quizer.

Teria que ser, eu acho, em apenas uma query!

Obrigado, e um abraço!
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Só um detalhe...
Confirme ai se quando não há valor o conteúdo é zero ou null...

Se for null ai acredito que isso resolva seu problema, pois estas funções (no caso SUM() ) ignoram null...

Selecionar tudo

SELECT data, grupo, SUM( nvl(valor,) )
WHERE grupo=1 AND data IN ('data1','data2')
GROUP BY data, grupo 
Inté
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Faltou o zero...rs

SELECT data, grupo, SUM( nvl(valor,0) )
WHERE grupo=1 AND data IN ('data1','data2')
GROUP BY data, grupo
raphaelias
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 31
Registrado em: Seg, 28 Abr 2008 1:51 pm
Localização: São Bernardo do Campo - SP

João,

Mesmo com o NVL ele não trará a linha pois não existe um registro nulo de pagamento naquela data.

O que pensei foi criar um select que me traga como resultado uma coluna com as datas, e com elas fazer um left join com a tabela pagamento, mas também não está dando certo.

Alguma outra sugestão?

Obrigado e abraço!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes