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
  

Mensagemem Seg, 29 Ago 2016 11:45 am

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

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?
jiopra

Mensagemem Seg, 29 Ago 2016 2:25 pm

Boa tarde,

Você pode tentar usar o extract (minute.

Já existem alguns tópicos aqui no forum.
spernega
Localização: São Paulo - SP

Mensagemem Qua, 31 Ago 2016 2:20 pm

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:
substr(obter_min_entre_datas(a.dt_entrada, a.dt_fim_consulta,null),1,50) qt_tempo_total
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Mensagemem Qua, 31 Ago 2016 3:13 pm

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.
jiopra

Mensagemem Qua, 31 Ago 2016 6:15 pm

Veja se assim que você precisa:

Código: Selecionar todos
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
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Mensagemem Qui, 01 Set 2016 11:25 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
jiopra

Mensagemem Qui, 01 Set 2016 11:41 am

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

Código: Selecionar todos
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
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Mensagemem Qui, 01 Set 2016 4:10 pm

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
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
jiopra

Mensagemem Qui, 01 Set 2016 4:27 pm

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:

Código: Selecionar todos
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)
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Mensagemem Qui, 01 Set 2016 5:27 pm

Assim geovani, veja se isso é possivel,

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
jiopra

Mensagemem Qui, 01 Set 2016 5:57 pm

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: obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null) * 86400 qt_tempo_espera
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com

Mensagemem Sex, 02 Set 2016 7:31 am

Bom dia,

Veja se esta função ajuda alguma coisa.

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

Mensagemem Seg, 05 Set 2016 8:24 am

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

obrigado
jiopra

Mensagemem Seg, 05 Set 2016 11:49 am

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!
geovani
Localização: Joinville-SC

Geovani Cristofolini
Consultor de Business intelligence
http://useweknow.com



Voltar para SQL

Quem está online

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