Select - com problemas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
mariogus
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 157
Registrado em: Sex, 30 Nov 2007 1:17 pm
Localização: Porto Alegre - RS

Pessoal,

No meu resultado - os dados estão saindo duplicados. A intenção é ter somado os códigos de status (dsc_status) e os seus devidos tempos de atividades que é a parte (h.dat_fechamento - h.dat_abertura) em dias,horas,minutos e segundos

Selecionar tudo

SELECT distinct s.dsc_status,sum(trunc(h.dat_fechamento - h.dat_abertura))
                               || ' DIAS ' || 
                               floor(((h.dat_fechamento - h.dat_abertura)*24*60*60)/3600)
                               || ' HORAS ' ||
                               floor((((h.dat_fechamento - h.dat_abertura)*24*60*60) -
                               floor(((h.dat_fechamento - h.dat_abertura)*24*60*60)/3600)*3600)/60)
                               || ' MINUTOS ' ||
                               round((((h.dat_fechamento - h.dat_abertura)*24*60*60) -
                               floor(((h.dat_fechamento - h.dat_abertura)*24*60*60)/3600)*3600 -
                               (floor((((h.dat_fechamento - h.dat_abertura)*24*60*60) -
                               floor(((h.dat_fechamento - h.dat_abertura)*24*60*60)/3600)*3600)/60)*60) ))
                               || ' SEGUNDOS ' tempo_atividade
                               FROM sgc.hchamados h,tecnicos t,status s
                               where h.cod_tecnico = t.cod_tecnico
                               and h.cod_status = s.cod_status
                               group by s.dsc_status,h.dat_fechamento - h.dat_abertura
                               order by 1 asc;


Dados Extraídos :
  • DSC_STATUS TEMPO_ATIVIDADE
    ABERTO SEM ATENDIMENTO 2 DIAS 24 HORAS 0 MINUTOS 0 SEGUNDOS
    ABERTO SEM ATENDIMENTO 2 DIAS 48 HORAS 0 MINUTOS 0 SEGUNDOS
    ABERTO SEM ATENDIMENTO 0 DIAS 0 HORAS 0 MINUTOS 0 SEGUNDOS
    ATENDIMENTO AINDA SEM SOLUCAO 1 DIAS 24 HORAS 0 MINUTOS 0 SEGUNDOS
    CHAMADO LIBERADO 9 DIAS 216 HORAS 0 MINUTOS 0 SEGUNDOS
    CHAMADO LIBERADO 0 DIAS 0 HORAS 0 MINUTOS 0 SEGUNDOS
    CHAMADO LIBERADO 3 DIAS 72 HORAS 0 MINUTOS 0 SEGUNDOS
    CHAMADO LIBERADO 4 DIAS 48 HORAS 0 MINUTOS 0 SEGUNDOS
    CHAMADO LIBERADO 1 DIAS 24 HORAS 0 MINUTOS 0 SEGUNDOS
    EM ATENDIMENTO 3 DIAS 72 HORAS 0 MINUTOS 0 SEGUNDOS
    EM ATENDIMENTO 1 DIAS 24 HORAS 57 MINUTOS 59 SEGUNDOS
    EM ATENDIMENTO 4 DIAS 96 HORAS 0 MINUTOS 0 SEGUNDOS
    EM ATENDIMENTO 6 DIAS 48 HORAS 0 MINUTOS 0 SEGUNDOS
    EM ATENDIMENTO 5 DIAS 120 HORAS 0 MINUTOS 0 SEGUNDOS
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Você precisaria usar o group by apenas pelo campo a.dsc_status, sempre utilizando o sum sobre a diferença entre as datas. Ficaria algo assim:

Selecionar tudo

select dsc_status
     , truncintervalo || ' DIAS ' ||
       floor( (intervalo) * 24 * 60 * 60) / 3600) || ' HORAS ' ||
       floor((((intervalo) * 24 * 60 * 60) - floor(((intervalo) * 24 * 60 * 60) / 3600) * 3600) / 60) || ' MINUTOS ' ||
       round((((intervalo) * 24 * 60 * 60) - floor(((intervalo) * 24 * 60 * 60) / 3600) * 3600 
			      - (floor((((intervalo) * 24 * 60 * 60) 
						- floor(((intervalo) * 24 * 60 * 60) / 3600) * 3600) / 60) * 60))) ||' SEGUNDOS ' tempo_atividade
from
(
	select s.dsc_status
			 , sum(h.dat_fechamento - h.dat_abertura) intervalo
	from   sgc.hchamados h
			 , tecnicos      t
			 , status        s
	where  h.cod_tecnico = t.cod_tecnico
	and    h.cod_status = s.cod_status
	group  by s.dsc_status
					, h.dat_fechamento - h.dat_abertura
)
order  by 1 asc;
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Ops, esqueci dos parênteses na 2ª linha

Selecionar tudo

     , trunc(intervalo) || ' DIAS ' || 
Responder
  • Informação