Problema com retorno de count + data

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Galera estou montando uma Query e me deparei com o seguinte problema:

No meu caso estou contando o numero de cirurgias realizada em uma determinada data.Ex:

Selecionar tudo

SELECT to_char(dt_realizacao, 'dd-mm-yyyy')data,'Grande Porte', COUNT(*)total
FROM DBAMV.AVISO_CIRURGIA,
     DBAMV.CIRURGIA_AVISO,
     DBAMV.CIRURGIA
WHERE AVISO_CIRURGIA.CD_AVISO_CIRURGIA = CIRURGIA_AVISO.CD_AVISO_CIRURGIA
AND CIRURGIA_AVISO.CD_CIRURGIA = CIRURGIA.CD_CIRURGIA
AND AVISO_CIRURGIA . TP_SITUACAO = 'R'
and AVISO_CIRURGIA.cd_cen_cir = 1
and TP_CIRURGIA = 'G'
and trunc(dt_realizacao) between To_Date('01/06/2017','dd/mm/yyyy') and To_Date('03/06/2017','dd/mm/yyyy')
GROUP BY to_char(dt_realizacao, 'dd-mm-yyyy')
Quando executo a query acima retorna a seguinte informação:
01/06/2017 | grande porte | 6
02/06/2017 | grande porte | 6

mas gostaria que retornasse os 3 dias e no caso de não ter cirurgia retornar 0. EX:
01/06/2017 | grande porte | 6
02/06/2017 | grande porte | 6
03/06/2017 | grande porte | 0

é possível fazer algum esquema para mostrar a data que não teve resultado?

Desde já agradeço os mestres... :D
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Boa tarde,

Segue uma solução mais ou menos...

Usar uma tabela de calendario (eu uso uma visão)


Não testado:

SELECT data,'Grande Porte', Sum(total) total
from (
SELECT to_char(dt_realizacao, 'dd-mm-yyyy')data,'Grande Porte', COUNT(*)total
FROM DBAMV.AVISO_CIRURGIA,
DBAMV.CIRURGIA_AVISO,
DBAMV.CIRURGIA,
CALENDARIO CAL
WHERE AVISO_CIRURGIA.CD_AVISO_CIRURGIA = CIRURGIA_AVISO.CD_AVISO_CIRURGIA
AND CIRURGIA_AVISO.CD_CIRURGIA = CIRURGIA.CD_CIRURGIA
AND AVISO_CIRURGIA . TP_SITUACAO = 'R'
and AVISO_CIRURGIA.cd_cen_cir = 1
and TP_CIRURGIA = 'G'
and trunc(dt_realizacao) between To_Date('01/06/2017','dd/mm/yyyy') and To_Date('03/06/2017','dd/mm/yyyy')
GROUP BY to_char(dt_realizacao, 'dd-mm-yyyy')
Union all
Select dt_calendario,'Grande Porte', 0
from calendrio
where dt_calendario between To_Date('01/06/2017','dd/mm/yyyy') and To_Date('03/06/2017','dd/mm/yyyy'))
Group by data;
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

spernega, boa tarde!

Vou fazer um teste. eu utilizei algo parecido com uma tabela que já existia...

mas para funcionar eu teria que alimentar essa tabela antes de realizar a query certo?
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Douglas, eu uso uma visão
Me é útil pra um monte de coisas

create or replace view vw_calendario_dia as
select trunc(sysdate) - Level Dt_Emis
From dual
CONNECT BY LEVEL <= 7200
union all
select trunc(sysdate) Dt_Emis
From dual
union all
select trunc(sysdate) + Level Dt_Emis
From dual
CONNECT BY LEVEL <= 7200
/
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Gostei da sua ideia, essa View já tem varias datas...pode utilizar para varias coisas mesmo hein....já deixei salvo aqui, vou criar uma view tb. :lol:

Eu consegui resolver utilizando uma ideia parecida. Eu utilizei uma tabela qualquer do banco para gerar as datas que eu precisava. segue o exemplo:

Selecionar tudo

SELECT TO_CHAR(TO_DATE('01-06-2017','DD/MM/YYYY') - 1 + ROWNUM,'DD-MM-YYYY') DATA,'Grande Porte'porte,0 total
  FROM dbamv.cid
 WHERE TO_DATE('01/06/2017','DD/MM/YYYY') - 1 + ROWNUM <= '03/06/2017'
Esse é meu código final:

Selecionar tudo

SELECT DATA
       ,PORTE
       ,SUM(TOTAL)TOTAL
  FROM (SELECT to_char(dt_realizacao, 'dd-mm-yyyy')data,'Grande Porte'PORTE, COUNT(*)total
         FROM DBAMV.AVISO_CIRURGIA,
              DBAMV.CIRURGIA_AVISO,
              DBAMV.CIRURGIA
        WHERE AVISO_CIRURGIA.CD_AVISO_CIRURGIA = CIRURGIA_AVISO.CD_AVISO_CIRURGIA
          AND CIRURGIA_AVISO.CD_CIRURGIA = CIRURGIA.CD_CIRURGIA
          AND AVISO_CIRURGIA . TP_SITUACAO = 'R'
          and AVISO_CIRURGIA.cd_cen_cir = 1
          and TP_CIRURGIA = 'G'
          and trunc(dt_realizacao) between To_Date('01/06/2017','dd/mm/yyyy') and To_Date('03/06/2017','dd/mm/yyyy')
        GROUP BY to_char(dt_realizacao, 'dd-mm-yyyy')
        
        union all
        
        SELECT TO_CHAR(TO_DATE('01-06-2017','DD/MM/YYYY') - 1 + ROWNUM,'DD-MM-YYYY') DATA,'Grande Porte'porte,0 total
          FROM dbamv.cid
         WHERE TO_DATE('01/06/2017','DD/MM/YYYY') - 1 + ROWNUM <= '03/06/2017'
 )GROUP BY DATA,PORTE
Responder
  • Informação
  • Quem está online

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