Colega, vc está correto quando diz que SUM não vai trazer registros logicamente 
'faltantes' , e também quando diz que a informação TEM que vir de algum lugar 
(informação faltante simplesmente não aparece per se, coreto), MAS está ** 
Enganado ** ao dizer que não é possível em SQL a não ser com um join custoso : 
o fato é que a linguagem SQL permite (SEMPRE permitiu) que vc INVENTE valores 
via expressão : por exemplo, se vc quisesse que apareça 30 vezes a letra X, 
basta fazer um SELECT 'X' FROM tabelaquetragatrintalinhas, se vc quiser trazer 
10 vezes o resultado da conta 1+1 vc seleciona 1+1 duma tabela com 10 
linhas.... Aliás, é EXATAMENTE ESSA a função da tabela DUAL, ela é uma simples 
tabela com 1 linha só, então SELECT abobrinha FROM tabeladumalinhasó faz 
ABOBRINHA aparecer uma vez só, POR CAUSA dessa característica, ok ? Aliás, DUAL 
é simplesmente uma tabela que tem 1 linha só, Simples assim - o que eu já ouvi 
de besteira sobre a DUAL, que é mágica, que é interna, que é especial, irc...

Então, pra gente obter os 30 dias de Novembro (a info faltante/incompleta) , 
CONHECENDO o ponto acima E SABENDO que o Oracle faz aritmética de datas pra 
gente, basta selecionarmos de uma fonte que SEMPRE tenha 30 e usar um recurso 
que traga um número sequencial pra cada linha pra ser o dia , é o ROWNUM, assim 
:

sc...@o10gr2:SQL>select to_date('31/10/2009', 'dd/mm/yyyy')+rownum data_calend
  2   from all_objects where rownum < 31;

DATA_CALEND
-------------------
01/11/2009 00:00:00
02/11/2009 00:00:00
03/11/2009 00:00:00
04/11/2009 00:00:00
05/11/2009 00:00:00
06/11/2009 00:00:00
07/11/2009 00:00:00
08/11/2009 00:00:00
09/11/2009 00:00:00
10/11/2009 00:00:00
11/11/2009 00:00:00
12/11/2009 00:00:00
13/11/2009 00:00:00
14/11/2009 00:00:00
15/11/2009 00:00:00
16/11/2009 00:00:00
17/11/2009 00:00:00
18/11/2009 00:00:00
19/11/2009 00:00:00
20/11/2009 00:00:00
21/11/2009 00:00:00
22/11/2009 00:00:00
23/11/2009 00:00:00
24/11/2009 00:00:00
25/11/2009 00:00:00
26/11/2009 00:00:00
27/11/2009 00:00:00
28/11/2009 00:00:00
29/11/2009 00:00:00
30/11/2009 00:00:00

30 linhas selecionadas.


==> Com esse conceito fica ** RIDICULAMENTE ** simples a lógica, eu quero fazer 
OUTER JOIN da info completa acima COM a tabela de atendimentos , assim :

sc...@o10gr2:SQL>create table atendime(dt_atendimento date);

Tabela criada.


sc...@o10gr2:SQL>insert into atendime values(to_date('01/11/2009', 
'dd/mm/yyyy'));

1 linha criada.

sc...@o10gr2:SQL>insert into atendime values(to_date('01/11/2009', 
'dd/mm/yyyy'));

1 linha criada.

sc...@o10gr2:SQL>insert into atendime values(to_date('05/11/2009', 
'dd/mm/yyyy'));

1 linha criada.


==> legal, tenho 2 atendimentos no dia 1 e um atendimento dia 5, veja :


sc...@o10gr2:SQL>ed
Gravou file afiedt.buf

  1   select b.data_calend, count(a.dt_atendimento)
  2     from atendime a,
  3          (select to_date('31/10/2009', 'dd/mm/yyyy')+rownum data_calend
  4              from all_objects where rownum < 31
  5           )       b
  6    where a.dt_atendimento (+) = b.data_calend
  7   group by b.data_calend, a.dt_atendimento
  8*  order by b.data_calend
sc...@o10gr2:SQL>/

DATA_CALEND         COUNT(A.DT_ATENDIMENTO)
------------------- -----------------------
01/11/2009 00:00:00                       2
02/11/2009 00:00:00                       0
03/11/2009 00:00:00                       0
04/11/2009 00:00:00                       0
05/11/2009 00:00:00                       1
06/11/2009 00:00:00                       0
07/11/2009 00:00:00                       0
08/11/2009 00:00:00                       0
09/11/2009 00:00:00                       0
10/11/2009 00:00:00                       0
11/11/2009 00:00:00                       0
12/11/2009 00:00:00                       0
13/11/2009 00:00:00                       0
14/11/2009 00:00:00                       0
15/11/2009 00:00:00                       0
16/11/2009 00:00:00                       0
17/11/2009 00:00:00                       0
18/11/2009 00:00:00                       0
19/11/2009 00:00:00                       0
20/11/2009 00:00:00                       0
21/11/2009 00:00:00                       0
22/11/2009 00:00:00                       0
23/11/2009 00:00:00                       0
24/11/2009 00:00:00                       0
25/11/2009 00:00:00                       0
26/11/2009 00:00:00                       0
27/11/2009 00:00:00                       0
28/11/2009 00:00:00                       0
29/11/2009 00:00:00                       0
30/11/2009 00:00:00                       0

30 linhas selecionadas.

===>>> ***** NÃO ***** faz sentido criar fisicamente os dados, nem usar PL/SQL 
quando o SQL é simples, fácil e rápido.... Uma dica pro colega que iniciou a 
thread : eu vi que vc não usada o formato de data explícito, PLEASE PLEASE 
passe SEMPRE a fazer isso, é o bé-a-bá da programação SEGURA em bd Oracle...

[]s

  Chiappa
  

--- Em oracle_br@yahoogrupos.com.br, Evandro Giachetto <evandrogiache...@...> 
escreveu
>
> Acho que somente trocando count por sum não vai adiantar mta coisa.
> 
> Acontece que, pelo que percebi, não há registros para as datas 02-11-2009 e
> 30-11-2009, por esse motivo, tais datas não são contadas.
> 
> Não há como um select retornar registros que não existem em um determinado
> conjunto de dados. A única forma de fazer isso via select seria informando
> manualmente todas as datas possíveis que você quer retornar e fazendo um
> count individual para cada uma em sua tabela atendime.
> 
> Acho que dá para perceber que essa query ficaria gigantesca e extremamente
> custosa.
> 
> Talvez a melhor saída seja fazer isso via PL/SQL.
> 
> Att.
> 
> Evandro Giachetto
> Oracle SQL Expert
> Oracle Certified Associate
> evan...@...
> 
> 
> Em 19 de fevereiro de 2010 21:48, Rodrigo Mufalani
> <mufal...@...>escreveu:
> 
> >
> >
> > Tente trocar a função count por sum(nvl(dt_atendimento))
> >
> > Atenciosamente,
> > Rodrigo Mufalani
> >
> > Em 19/02/2010, às 20:48, "cegoncalvesvr" 
> > <cegoncalve...@...<cegoncalvesvr%40yahoo.com.br>>
> >
> > escreveu:
> >
> >
> > > Amigos,
> > >
> > > select
> > > dt_atendimento,
> > > count(*)
> > > from dbamv.atendime
> > > where dt_atendimento >= '01/11/2009' and dt_atendimento <=
> > > '30/11/2009'
> > > group by dt_atendimento
> > >
> > > SAIDA:
> > > 01-11-2009 10
> > > 02-11-2009 00 -- Como faço para a query acima mostrar TODOS os dias
> > > do mes e colocar ZERO quando na data não houver registros?
> > > 03-11-200 09
> > > .......
> > > 30-11-2009 00
> > >
> > > Abraços.
> > > Obrigado
> > >
> > >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >  
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a