Jump to content
Sign in to follow this  
nicolasrds

Formatar a query para trazer em coluna ao invés da linha

Recommended Posts

Pessoal, Como faço para formatar a query abaixo para trazer a primeira 'data_entrada' com a primeira 'data_saida' ?!?

Atualmente minha query está trazendo como linha, gostaria de trazer como coluna.

select
  atendimento,
  paciente,
  data_internacao,
  data_entrada,
  data_saida
  from
(
-- TRANSFERIDO PARA(SAIDA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
       trunc(atendime.dt_atendimento) data_internacao,
       ' ' data_entrada,
       to_char(mov_int.hr_mov_int,'dd/mm/yyyy hh24:mi') data_saida,
       trunc(mov_int.dt_mov_int) data_pesquisa,
       unid_int.ds_unid_int unidade_internacao
       from mov_int
       inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
       inner join leito leito_origem on leito_origem.cd_leito = mov_int.cd_leito_anterior
       inner join unid_int on leito_origem.cd_unid_int = unid_int.cd_unid_int
       inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
       inner join paciente on  atendime.cd_paciente = paciente.cd_paciente
where  mov_int.tp_mov = 'O'
and atendime.tp_atendimento = 'I'
and leito_origem.cd_unid_int != leito_destino.cd_unid_int
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
-- TRANSFERIDO DE(ENTRADA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
       trunc(atendime.dt_atendimento) data_internacao,
       to_char(mov_int.hr_mov_int, 'dd/mm/yyy hh24:mi')  data_entrada,
       ' '                                                data_saida,
       trunc(mov_int.dt_mov_int) data_pesquisa,
       unid_int.ds_unid_int unidade_internacao
       from mov_int
       inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
       inner join leito leito_origem on leito_origem.cd_leito = mov_int.cd_leito_anterior
       inner join unid_int on leito_destino.cd_unid_int = unid_int.cd_unid_int
       inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
       inner join paciente on  atendime.cd_paciente = paciente.cd_paciente
where  mov_int.tp_mov = 'O'
and atendime.tp_atendimento = 'I'
and leito_origem.cd_unid_int != leito_destino.cd_unid_int
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
--INTERNACAO(ENTRADA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
       trunc(atendime.dt_atendimento) data_internacao,
       to_char(mov_int.hr_mov_int, 'dd/mm/yyy hh24:mi')  data_entrada,
       ' '                                                data_saida,
       trunc(mov_int.dt_mov_int) data_pesquisa,
       unid_int.ds_unid_int unidade_internacao
       from mov_int
       inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
       inner join unid_int on leito_destino.cd_unid_int = unid_int.cd_unid_int
       inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
       inner join paciente on  atendime.cd_paciente = paciente.cd_paciente
where mov_int.tp_mov = 'I'
and atendime.tp_atendimento = 'I'
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
--ALTA(SAIDA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
       trunc(atendime.dt_atendimento) data_internacao,
       ' ' data_entrada,
       to_char(atendime.hr_alta,'dd/mm/yyyy hh24:mi') data_saida,
       trunc(atendime.dt_alta) data_pesquisa,
       unid_int.ds_unid_int unidade_internacao
       from atendime
       inner join paciente on  atendime.cd_paciente = paciente.cd_paciente
       inner join leito on leito.cd_leito = atendime.cd_leito
       inner join unid_int on leito.cd_unid_int = unid_int.cd_unid_int
       inner join mot_alt  on atendime.cd_mot_alt = mot_alt.cd_mot_alt
where atendime.tp_atendimento = 'I') 
where data_pesquisa between '01/10/2016' and '31/10/2016' 
and unidade_internacao = 'UNIDADE A'
and atendimento = 102866
order by data_pesquisa; 

Resultado atual:

Atendimento | Paciente | Data_internacao| Data_entrada | Data_saida |
102866 NICOLAS RODRIGUES 22/10/16 24/10/016 01:53
102866 NICOLAS RODRIGUES 22/10/16 27/10/016 17:44
102866 NICOLAS RODRIGUES 22/10/16 27/10/2016 16:13
102866 NICOLAS RODRIGUES 22/10/16 30/10/2016 18:31
A ideia é trazer da seguinte forma:
Atendimento | Paciente | Data_internacao| Data_entrada | Data_saida |
102866 NICOLAS RODRIGUES 22/10/16 24/10/016 01:53 27/10/2016 16:13
102866 NICOLAS RODRIGUES 22/10/16 27/10/016 17:44 30/10/2016 18:31
Desde já agradeço pela ajuda.

Share this post


Link to post
Share on other sites

Bom dia, não testei, mas veja se funciona

whit x as(
-- TRANSFERIDO PARA(SAIDA)
select atendime.cd_atendimento atendimento,
paciente.nm_paciente paciente,
trunc(atendime.dt_atendimento) data_internacao,
' ' data_entrada,
to_char(mov_int.hr_mov_int,'dd/mm/yyyy hh24:mi') data_saida,
trunc(mov_int.dt_mov_int) data_pesquisa,
unid_int.ds_unid_int unidade_internacao
from mov_int
inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
inner join leito leito_origem on leito_origem.cd_leito = mov_int.cd_leito_anterior
inner join unid_int on leito_origem.cd_unid_int = unid_int.cd_unid_int
inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
inner join paciente on atendime.cd_paciente = paciente.cd_paciente
where mov_int.tp_mov = 'O'
and atendime.tp_atendimento = 'I'
and leito_origem.cd_unid_int != leito_destino.cd_unid_int
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
-- TRANSFERIDO DE(ENTRADA)
select atendime.cd_atendimento atendimento,
paciente.nm_paciente paciente,
trunc(atendime.dt_atendimento) data_internacao,
to_char(mov_int.hr_mov_int, 'dd/mm/yyy hh24:mi') data_entrada,
' ' data_saida,
trunc(mov_int.dt_mov_int) data_pesquisa,
unid_int.ds_unid_int unidade_internacao
from mov_int
inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
inner join leito leito_origem on leito_origem.cd_leito = mov_int.cd_leito_anterior
inner join unid_int on leito_destino.cd_unid_int = unid_int.cd_unid_int
inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
inner join paciente on atendime.cd_paciente = paciente.cd_paciente
where mov_int.tp_mov = 'O'
and atendime.tp_atendimento = 'I'
and leito_origem.cd_unid_int != leito_destino.cd_unid_int
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
--INTERNACAO(ENTRADA)
select atendime.cd_atendimento atendimento,
paciente.nm_paciente paciente,
trunc(atendime.dt_atendimento) data_internacao,
to_char(mov_int.hr_mov_int, 'dd/mm/yyy hh24:mi') data_entrada,
' ' data_saida,
trunc(mov_int.dt_mov_int) data_pesquisa,
unid_int.ds_unid_int unidade_internacao
from mov_int
inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
inner join unid_int on leito_destino.cd_unid_int = unid_int.cd_unid_int
inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
inner join paciente on atendime.cd_paciente = paciente.cd_paciente
where mov_int.tp_mov = 'I'
and atendime.tp_atendimento = 'I'
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
--ALTA(SAIDA)
select atendime.cd_atendimento atendimento,
paciente.nm_paciente paciente,
trunc(atendime.dt_atendimento) data_internacao,
' ' data_entrada,
to_char(atendime.hr_alta,'dd/mm/yyyy hh24:mi') data_saida,
trunc(atendime.dt_alta) data_pesquisa,
unid_int.ds_unid_int unidade_internacao
from atendime
inner join paciente on atendime.cd_paciente = paciente.cd_paciente
inner join leito on leito.cd_leito = atendime.cd_leito
inner join unid_int on leito.cd_unid_int = unid_int.cd_unid_int
inner join mot_alt on atendime.cd_mot_alt = mot_alt.cd_mot_alt
where atendime.tp_atendimento = 'I')
where data_pesquisa between '01/10/2016' and '31/10/2016'
and unidade_internacao = 'UNIDADE A'
and atendimento = 102866)
select x.atendimento,
x.paciente,
x.data_internacao,
min(x.data_entrada) data_entrada,
min(x.data_saida) data_saida
from x
group by x.atendimento, x.paciente, x.data_internacao

Share this post


Link to post
Share on other sites

Uma GROUP BY com MIN e MAX deve resolver

select
  atendimento,
  paciente,
  data_internacao,
  min(data_entrada),
  max(data_saida)
  from
(
-- TRANSFERIDO PARA(SAIDA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
...
where atendime.tp_atendimento = 'I')
where data_pesquisa between '01/10/2016' and '31/10/2016'
and unidade_internacao = 'UNIDADE A'
and atendimento = 102866
group by  atendimento,
  paciente,
  data_internacao  
order by data_pesquisa;

Share this post


Link to post
Share on other sites

Pessoal boa noite,

Com os agrupamentos não deu certo, mas me deu uma ideia e acabei resolvendo de um outro jeito.

De qualquer forma vlw. vocês são feras :D

select atendimento,
       paciente, 
       data_internacao,
       data_entrada,
       data_saida,
from
(
-- TRANSFERIDO DE(ENTRADA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
       unid_int.ds_unid_int unidade_internacao,
       trunc(atendime.dt_atendimento) data_internacao,
       leito_origem.ds_resumo origem,
       leito_destino.ds_resumo destino,
       mov_int.hr_mov_int  data_entrada,
       case when(select min(m2.hr_mov_int) from mov_int m2 where m2.cd_leito_anterior = mov_int.cd_leito 
            and m2.cd_atendimento = mov_int.cd_atendimento 
            and m2.hr_mov_int > mov_int.hr_mov_int) is null
       then (select at.hr_alta from atendime at where at.cd_atendimento = mov_int.cd_atendimento 
            and at.cd_mot_alt is not null 
            and at.hr_alta > mov_int.hr_mov_int)
       else (select  min(m2.hr_mov_int) from mov_int m2 where m2.cd_leito_anterior = mov_int.cd_leito 
            and m2.cd_atendimento = mov_int.cd_atendimento 
            and m2.hr_mov_int > mov_int.hr_mov_int) end  data_saida
       from mov_int
       inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
       inner join leito leito_origem on leito_origem.cd_leito = mov_int.cd_leito_anterior
       inner join unid_int on leito_destino.cd_unid_int = unid_int.cd_unid_int
       inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
       inner join paciente on  atendime.cd_paciente = paciente.cd_paciente
where  mov_int.tp_mov = 'O'
and atendime.tp_atendimento = 'I'
and leito_origem.cd_unid_int != leito_destino.cd_unid_int
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
union all
--INTERNACAO(ENTRADA)
select atendime.cd_atendimento atendimento,
       paciente.nm_paciente paciente,
       unid_int.ds_unid_int unidade_internacao,
       trunc(atendime.dt_atendimento) data_internacao,
       ' ' origem,
       leito_destino.ds_resumo destino,
       mov_int.hr_mov_int  data_entrada,
       case when(select min(m2.hr_mov_int) from mov_int m2 where m2.cd_leito_anterior = mov_int.cd_leito 
            and m2.cd_atendimento = mov_int.cd_atendimento 
            and m2.hr_mov_int > mov_int.hr_mov_int) is null
       then (select at.hr_alta from atendime at where at.cd_atendimento = mov_int.cd_atendimento 
            and at.cd_mot_alt is not null 
            and at.hr_alta > mov_int.hr_mov_int)
       else (select  min(m2.hr_mov_int) from mov_int m2 where m2.cd_leito_anterior = mov_int.cd_leito 
            and m2.cd_atendimento = mov_int.cd_atendimento 
            and m2.hr_mov_int > mov_int.hr_mov_int) end  data_saida
       from mov_int
       inner join leito leito_destino on leito_destino.cd_leito = mov_int.cd_leito
       inner join unid_int on leito_destino.cd_unid_int = unid_int.cd_unid_int
       inner join atendime on mov_int.cd_atendimento = atendime.cd_atendimento
       inner join paciente on  atendime.cd_paciente = paciente.cd_paciente
where mov_int.tp_mov = 'I'
and atendime.tp_atendimento = 'I'
and unid_int.sn_ativo = 'S'
and trunc(nvl(mov_int.dt_lib_mov, sysdate)) >= trunc(mov_int.dt_mov_int)
)where data_entrada between '01/10/2016' and '31/10/2016'
 and unidade_internacao = 'UNIDADE A'
 and atendimento = 102866;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Thiago Btos
      Boa tarde galera.
       
      Fiz um select que tras 4 informações do banco (matricula, nome, data e hora)
      SELECT QD1_MAT, RA_NOME, QD1_DTBAIX AS DATA, QD1_HRBAIX FROM QD1010 QD1 INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*' ORDER BY QD1_DTBAIX, QD1_HRBAIX Retornando os seguintes registros:

       
       
       
      Preciso retornar somente as linhas em amarelo, que seria a seguinte condição.
      Caso tiver alguma matricula igual, trazer somente o registro com a maior data, junto com seu respectivo horário.
       
       
      O mais próximo que consegui chegar foi utilizando o MAX para data e hora, e agrupando o restante dos campos.
      SELECT QD1_MAT,RA_NOME,MAX(DATA), MAX(QD1_HRBAIX) FROM ( SELECT QD1_MAT, RA_NOME, QD1_DTBAIX AS DATA, QD1_HRBAIX FROM QD1010 QD1 INNER JOIN SRA010 SRA ON RA_MAT = SUBSTR(QD1_MAT, 5) AND SRA.D_E_L_E_T_ <> '*' ) GROUP BY QD1_MAT,RA_NOME Porém na hora ele não pega o valor correspondente e sim o valor máximo.

       
       
      Ai estou travado nessa parte, como faço para trazer a hora corresponde sem o restante dos registros?
    • By mr22robot
      Boa tarde. Estou com o seguinte problema: Preciso retornar um selct da seguinte maneira:
      exemplo que não funciona:
      select codusur,numnota,codcli,cliente,vltotal,numtransvenda,dev,decode(vlvenda),if(vlvenda > 100 then 1 else 2) from( select tb1.codusur,tb1.numnota,tb1.codcli,tb1.cliente,tb1.vltotal,tb1.numtransvenda,DECODE(tb2.VLTOTAL,NULL,0,tb2.VLTOTAL)DEV from( select codusur,numnota,pcnfsaid.codcli,pcnfsaid.cliente,pcnfsaid.vltotal,pcnfsaid.numtransvenda from pcnfsaid where pcnfsaid.dtsaida > '01-OCT-2020' and pcnfsaid.dtcancel is null )tb1 left outer join (select DISTINCT VLTOTAL,VW_INTEGRA_DEVOLUCAO_TOTAL.NUMTRANSVENDA from VW_INTEGRA_DEVOLUCAO_TOTAL )tb2 on tb1.NUMTRANSVENDA = tb2.NUMTRANSVENDA order by numnota ) Como pode reparar, eu usei um if/else já que não sei a forma correta de usar. Pois com DECODE não consegui usar uma forma de fazer a comparação. 
      Pois preciso mesmo retornar uns valores fixos. Ex: 
      Se o valor > 40000, retorna um valor x; Se for maior que 5000 retorna um valor y. 
      Aguardo a ajuda dos amigos. Grato
    • By MarcosAntonio
      boa tarde. 
      Estou precisando de um Select que retorne uma soma que ao chegar a determinado valor ela reinicie e continue fazendo sucessivamente
       select   pedido,   volume,   limite,   SUM(volume) over (order by pedido ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) saldo   from pedidos  group by pedido o select está retornando assim porém quero que toda vez que chegue ou passe do limite resete o saldo, por exemplo parar no 100 que é o limite e começar um novo saldo
      pedido     volume    limite    saldo  1             70            100        70  2             10            100        80  3             20            100        100  4             50            100        150  5             30            100        180  
      preciso que ele soma o volume enquanto o saldo seja <= que o "limite", quando passar pare de somar e comece outra soma começando do 0, como no exemplo abaixo.
      pedido    volume    limite    saldo  1             70            100        70  2             10            100        80  3             20            100        100  4             50            100        50  5             30            100        80  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.