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