Página 1 de 1

Problema com retorno de count + data

Enviado: Ter, 27 Jun 2017 12:36 pm
por douglasmattos
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

Re: Problema com retorno de count + data

Enviado: Ter, 27 Jun 2017 12:55 pm
por spernega
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;

Re: Problema com retorno de count + data

Enviado: Ter, 27 Jun 2017 2:08 pm
por douglasmattos
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?

Re: Problema com retorno de count + data

Enviado: Ter, 27 Jun 2017 2:13 pm
por spernega
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
/

Re: Problema com retorno de count + data

Enviado: Ter, 27 Jun 2017 2:34 pm
por douglasmattos
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