Auxílio em SQL para Relatório

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jiopra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 29 Ago 2016 11:10 am

Tenho um sql aqui q é a base de um relatorio do meu sistema relacionado a tempo de espera de atendimentos médicos:

Selecionar tudo

 select	
	a.nr_atendimento,
substr(obter_min_entre_datas(a.dt_entrada, a.dt_atend_medico,null),1,50)  qt_tempo_espera,
substr(obter_min_entre_datas(a.dt_atend_medico, a.dt_fim_consulta, null),1,50) qt_temp_atend,
	substr(obter_nome_pf(a.cd_pessoa_fisica),1,50) nm_paciente,
	substr(obter_nome_pf(a.cd_medico_resp),1,50) nm_medico,
	a.dt_entrada,
	a.dt_inicio_atendimento,
	a.dt_fim_triagem,
	a.dt_alta,
	substr(obter_dif_data(a.dt_inicio_atendimento,a.dt_fim_triagem,null),1,20) teste,
	substr(obter_dif_data(a.dt_entrada,a.dt_alta,null),1,20) qt_tempo_atendimento

	from	atendimento_paciente a

where	a.dt_entrada between trunc(:dt_inicial) and fim_dia(:dt_final)
and	((:cd_setor_atendimento = obter_setor_atendimento(a.nr_atendimento)) or (:cd_setor_atendimento = '0'))
  order by
	a.dt_entrada
na coluna - qt_tempo_espera e na coluna qt_temp_atend, preciso realizar a soma dos minutos do relatorio e ao fim das colunas exibir um total dos minutos, como poderia fazer esse sum com as substr?
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,

Você pode tentar usar o extract (minute.

Já existem alguns tópicos aqui no forum.
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Opa!

Pelo que vi, você está usando uma função que calcula o tempo entre duas datas e retorna no formato de texto, e depois você quer somar esses dois tempos do tipo texto, é isso?

Para tomar o tempo total, porque você não usando essa função usando a.dt_entrada e a.dt_fim_consulta ?

exemplo:

Selecionar tudo

substr(obter_min_entre_datas(a.dt_entrada, a.dt_fim_consulta,null),1,50) qt_tempo_total
jiopra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 29 Ago 2016 11:10 am

Opa Geovani,

então mano é isso mesmo, preciso exibir a soma nas duas funções, fiz dessa forma porque preciso dos dados das duas colunas separas, a primeira exibe o tempo em minutos que o medico demorou para chamar a paciente desde sua entrada no hospital, e o outro exibe o tempo que o medico demorou para atender a paciente depois da chamada ate a hora da alta.

se puder se dar uma força em como posso fazer essa somatoria do total de cada coluna separado te agradeço, porque preciso exibir esses dados em uma reuniao dia 5/9

valeu abração.
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Veja se assim que você precisa:

Selecionar tudo

trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600) hora,
trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)) minuto,

lpad(trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600),2,0) ||':'||
lpad(trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)),2,0) hhmm
jiopra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 29 Ago 2016 11:10 am

Bom dia Geovani,

apliquei o código em meu sql, porém não realizou a calculo total das colunas, acho que apliquei o código no lugar errado do sql, poderia me informar em qual parte do sql aplico a codificação, só para ver se eu apliquei no lugar certo.

Muito Obrigado

Abraço
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Basta incluir os campos abaixo, segue o código:

Selecionar tudo

select
	a.nr_atendimento,
	substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) qt_tempo_espera,
	substr(obter_min_entre_datas(a.dt_atend_medico,a.dt_fim_consulta,null),1,50) qt_temp_atend,
	substr(obter_nome_pf(a.cd_pessoa_fisica),1,50) nm_paciente,
	substr(obter_nome_pf(a.cd_medico_resp),1,50) nm_medico,
	a.dt_entrada,
	a.dt_inicio_atendimento,
	a.dt_fim_triagem,
	a.dt_alta,
	substr(obter_dif_data(a.dt_inicio_atendimento,a.dt_fim_triagem,null),1,20) teste,
	substr(obter_dif_data(a.dt_entrada,a.dt_alta,null),1,20) qt_tempo_atendimento,
	trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600) hora,
	trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)) minuto,
	lpad(trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600),2,0) ||':'||
    	lpad(trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)),2,0) hhmm    
from
	atendimento_paciente a    
where
	a.dt_entrada between trunc(:dt_inicial) and fim_dia(:dt_final)  
	and (:cd_setor_atendimento = obter_setor_atendimento(a.nr_atendimento) or :cd_setor_atendimento = '0')
order by
	a.dt_entrada
jiopra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 29 Ago 2016 11:10 am

eitaaa geovani

descobri o problema mano, o meu relatório só consegue somar valores numerics, por isso não está dando certo, preciso converter os valores das duas colunas

Selecionar tudo

   substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) qt_tempo_espera,
   substr(obter_min_entre_datas(a.dt_atend_medico,a.dt_fim_consulta,null),1,50) qt_temp_atend,
para um valor numerico ai assim consigo faz o total, sabes como realizar essa mudança ? sei que o campo das data é date.

abraçãoo
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Não estou entendo o que você precisa.

Essa função obter_min_entre_datas retorna em qual formato? se for numérico basta somar:

Selecionar tudo

substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) + 
substr(obter_min_entre_datas(a.dt_atend_medico,a.dt_fim_consulta,null),1,50) 
jiopra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 29 Ago 2016 11:10 am

Assim geovani, veja se isso é possivel,

Selecionar tudo

substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) qt_tempo_espera

essa função OBTER os dois campos que estou utilizando a.dt_entrada e a.dt_atend_medico ambos são do tipo DATE logo a coluna QT_TEMPO_ESPERA também é DATE, precisaria converter o dado antes de ser mostrado na coluna para tipo NUMBER que ai consigo realizar a soma da coluna toda pelo meu proprio gerenciador do relatorio do sistema.

conseguiu me entender?

kkkkk
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Você tem certeza que o retorno é uma data? pelo nome da função parece que retorna um número, rsrsrs.

Passa a função para entendermos melhor.

Se retorna mesmo uma data, basta multiplicar por 86400 para converter em segundos.

Ex:

Selecionar tudo

obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null) * 86400 qt_tempo_espera
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia,

Veja se esta função ajuda alguma coisa.

Selecionar tudo

create or replace 
function Fn_Intervalo_Tempo (P_Dt_Inic in date,
                             P_Dt_Fina in date) return varchar2 is
 v_inte  number;
 v_Hora  varchar2(200);
 --
 cursor c is
   SELECT lpad(   extract (day    from numtodsinterval(v_inte, 'day'))    ,5,' ') Qt_Dias,
          lpad(   extract (hour   from numtodsinterval(v_inte, 'day'))    ,2,'0') Qt_Horas,
          lpad(   extract (minute from numtodsinterval(v_inte, 'day' ))   ,2,'0') Qt_Minutos,
          lpad(   extract (second from numtodsinterval(v_inte, 'day'))    ,2,'0') Qt_Segundos
   FROM   dual;
 c_r c%rowtype;
 --
begin
 --
 v_inte := trunc((p_dt_Fina - p_dt_Inic),6);
 dbms_output.put_line('v_inte     '||to_char(v_inte));
 --
 open c;
  fetch c into c_r;
   if c%found then
      --
      dbms_output.put_line('c_r.Qt_Dias     '||c_r.Qt_Dias);
      dbms_output.put_line('c_r.Qt_Horas    '||c_r.Qt_Horas);
      dbms_output.put_line('c_r.Qt_Minutos  '||c_r.Qt_Minutos);
      dbms_output.put_line('c_r.Qt_Segundos '||lpad(trunc(c_r.Qt_Segundos),2,'0'));
      --
      v_hora := c_r.Qt_Dias||' '||c_r.Qt_Horas||':'||c_r.Qt_Minutos||':'||lpad(trunc(c_r.Qt_Segundos),2,'0');
   end if;
 close c;
 return v_hora;
exception
 when others then
  return 'erro';
End;
/
Pra trazer o total em minutos precisa tratar os resultados.
Hora * 60
Dias * 1440
jiopra
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 29 Ago 2016 11:10 am

Pessoal agradeço pelas dicas, mas nada resolveu meu problema, vou tentar realizar de uma outra forma o ajuste.

obrigado
geovani
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Sáb, 06 Ago 2016 9:22 am
Localização: Joinville-SC
Contato:
Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

jiopra,

Acho que não conseguimos porque não ficou claro exatamente o que você precisa, mas acredito que as dicas e funções passadas aqui você conseguirá.

Valeu!
Responder
  • Informação
  • Quem está online

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