Aprenda PL/SQL

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
  

Mensagemem Ter, 27 Jun 2017 12:36 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:

Código: Selecionar todos
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
douglasmattos

Mensagemem Ter, 27 Jun 2017 12:55 pm

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;
spernega
Localização: São Paulo - SP

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

Mensagemem Ter, 27 Jun 2017 2:13 pm

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
/
spernega
Localização: São Paulo - SP

Mensagemem Ter, 27 Jun 2017 2:34 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 também. :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:

Código: Selecionar todos
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:
Código: Selecionar todos
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
douglasmattos



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante