Ok : pra não ficar "no ar", vamos Exemplificar... Primeiro, vaeja que na query abaixo eu não tenho registros para TODOS os meses do ano 1981 :
scott@DESENV:SQL>select empno, trunc(hiredate, 'month') data from emp where extract(year from hiredate)=1981; EMPNO DATA --------- ------------------- 7499 01/02/1981 00:00:00 7521 01/02/1981 00:00:00 7566 01/04/1981 00:00:00 7654 01/09/1981 00:00:00 7698 01/05/1981 00:00:00 7782 01/06/1981 00:00:00 7839 01/11/1981 00:00:00 7844 01/09/1981 00:00:00 7900 01/12/1981 00:00:00 7902 01/12/1981 00:00:00 10 linhas selecionadas. scott@DESENV:SQL> => Aí, digamos que eu tenho essa sua necessidade, ie : quando NÃO existir o dado na tabela principal, eu quero trazer de OUTRA fonte de dados : poderia ser uma tabela real mesmo, mas Outras possibilidades de 'INVENTAR' dados existem, uma delas é o CONNECT BY, funciona a partir do 9ir2, iirc , vejamos : scott@DESENV:SQL>SELECT TO_DATE('01/' || to_char(l, 'FM00') || '/1981') data, 0 contagem FROM (SELECT LEVEL l FROM dual CONNECT BY LEVEL < 13); DATA CONTAGEM ------------------- --------- 01/01/1981 00:00:00 0 01/02/1981 00:00:00 0 01/03/1981 00:00:00 0 01/04/1981 00:00:00 0 01/05/1981 00:00:00 0 01/06/1981 00:00:00 0 01/07/1981 00:00:00 0 01/08/1981 00:00:00 0 01/09/1981 00:00:00 0 01/10/1981 00:00:00 0 01/11/1981 00:00:00 0 01/12/1981 00:00:00 0 12 linhas selecionadas. scott@DESENV:SQL> ==> PRONTO, basta pedir que quando na primeira fonte de dados (a query na tabela EMP no meu exemplo) o dado venha da segunda fonte : COMO EU DISSE, UMA das maneiras é um OUTER JOIN, mas em alguns casos pode se usar MINUS, pode se usar Analytics (https://technology.amis.nl/2013/02/28/oracle-sql-spotting-combinations-that-occur-and-those-that-do-not-demonstrating-analytical-functions-outer-join-and-subquery-factoring/ tem um exemplo), enfim.... Vou usar aqui OUTER JOIN direto : scott@DESENV:SQL>ed Gravou file afiedt.buf 1 select nvl(E.data, F.data) DT, nvl(E.contagem, 0) 2 from ( 3 select trunc(hiredate, 'month') as data, count(*) as contagem from emp where extract(year from hiredate)=1981 GROUP BY trunc(hiredate, 'month') 4 ) E, 5 ( 6 select TO_DATE('01/' || to_char(l, 'FM00') || '/1981') data, 0 contagem FROM (SELECT LEVEL l FROM dual CONNECT BY LEVEL < 13) 7 ) F 8 where E.data (+) = F.data 9* order by 1 scott@DESENV:SQL>/ DT NVL(E.CONTAGEM,0) ------------------- ----------------- 01/01/1981 00:00:00 0 01/02/1981 00:00:00 2 01/03/1981 00:00:00 0 01/04/1981 00:00:00 1 01/05/1981 00:00:00 1 01/06/1981 00:00:00 1 01/07/1981 00:00:00 0 01/08/1981 00:00:00 0 01/09/1981 00:00:00 2 01/10/1981 00:00:00 0 01/11/1981 00:00:00 1 01/12/1981 00:00:00 2 12 linhas selecionadas. scott@DESENV:SQL> ==> Ou seja : Janeiro não tinha ocorrência mostra ZERO, Fev tinha dois mostrou contagem de dois, Março não tinha, Abril tinha um... É isso , certinho ?? []s Chiappa OBS : 1. nem preciso dizer que vc TEM que adaptar isso pra tua lógica aí e 2. acabou ficando meio comprido porque não quis me dar ao trabalho de criar uma tabela (seja tabela real seja GTT), não duvido que talvez fique mais curto se vc OU criar uma tabela mesmo com os dados a se 'inventar' OU se vc usar CTE...