Preciso como sempre. Matou o problema Chiappa. Muito obrigado novamente. []s
Emerson Sanches Em sex, 12 de jul de 2019 às 11:42, jlchia...@yahoo.com.br [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > 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... > > >