PIVOT SIMPLES(Sem Agregação)

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
brunomruiz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Out 2009 3:04 pm
Localização: Bebedouro - SP

Boa noite.

Tenho uma dúvida simples, mas que está tirando meu sono. Como faço um PIVOT sem agregação? Preciso "transpor" estes horários...
Imagem

Selecionar tudo

select --a.PIS,
       --to_char(cast(a.DATAHORA as date), 'dd-mon-rrrr') dia,
       to_char(cast(a.DATAHORA as date), 'hh24:mm') hora
       --count(a.PIS) contador
  from coleta a
 where 1 = 1
      --and    to_char(cast(a.DATAHORA as date),'dd-mon-rrrr') = pdData
   and a.DATAHORA >= '04-jun-2018'
   and a.PIS = '20474191251'
   and a.DATAHORA <= '05-jun-2018'
   and to_char(cast(a.DATAHORA as date), 'd') not in ('7', '8') --não busca o sábado e domingo
 --group by a.PIS, to_char(cast(a.DATAHORA as date), 'dd-mon-rrrr'),to_char(cast(a.DATAHORA as date), 'hh24:mm') 
--having count(a.PIS) <> '4' removido devido ao if buscando o contador
 --order by 1, 2
;
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Não compreendi exatamente tua necessidade.
Tu queres passara cada HORA:MINUTO para colunas?
Ou seria cada HORA as colunas e nelas teriam os minutos à ela pertencente?

Como seria saída desejada?
brunomruiz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Out 2009 3:04 pm
Localização: Bebedouro - SP

DanielNN escreveu:Não compreendi exatamente tua necessidade.
Tu queres passara cada HORA:MINUTO para colunas?
Ou seria cada HORA as colunas e nelas teriam os minutos à ela pertencente?

Como seria saída desejada?
Olá. Neste select eu comentei o PIS, mas é ideia de saída é:
PIS, HORARIO 1, HORARIO 2, HORARIO 3, HORARIO 4.

Transpor hora e minuto para colunas e não linhas.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

O que não estou entendendo é a necessidade de transpor HH:MI para coluna.
Desse jeito há 1440 colunas possível para armazenar isso. E fazer isso dinamicamente complica.

Olha:

http://glufke.net/oracle/viewtopic.php? ... vot#p41564

http://glufke.net/oracle/viewtopic.php? ... vot#p41600
brunomruiz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Out 2009 3:04 pm
Localização: Bebedouro - SP

DanielNN escreveu:O que não estou entendendo é a necessidade de transpor HH:MI para coluna.
Desse jeito há 1440 colunas possível para armazenar isso. E fazer isso dinamicamente complica.

Olha:

http://glufke.net/oracle/viewtopic.php? ... vot#p41564

http://glufke.net/oracle/viewtopic.php? ... vot#p41600
Oi Daniel, estive viajando e na volta parei no hospital, bom, vamos lá. Eu não pretendo "pivotar" 1440 colunas, porque vou quebrar por PIS e DATA, ficaria assim:
PIS DATA hora 1 hora 2 hora 3 hora 4
123456 07/07/18 07:40 12:01 13:13 17:00

Estou lendo seus artigos. Se tiver uma luz eu já retorno. Valeu.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Então é limitado a 4 horários os resgistros? Ou pode ter mais do que 4 para cada Data / PIS?
brunomruiz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 18
Registrado em: Seg, 26 Out 2009 3:04 pm
Localização: Bebedouro - SP

DanielNN escreveu:Então é limitado a 4 horários os resgistros? Ou pode ter mais do que 4 para cada Data / PIS?
É limitado a 4 horários. O que for diferente de 4 tratei de outra forma antes, este é o produto final limpo da análise.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Como não sei qual versão estás utilizando mas fiz "manual", sem usar a função PIVOT (introduzida na versão 11).
Usei recurso de função analítica para me dizer qual é o número/posição daquele horário naquele PIS/DIA.
Acredito que dessa forma te atenda.

Selecionar tudo

with COLETA AS (
select 'PIS1' PIS , '01/01/2018' DIA , '01:02' HORA FROM DUAL UNION ALL
select 'PIS1' PIS , '01/01/2018' DIA , '09:02' HORA FROM DUAL UNION ALL
select 'PIS1' PIS , '01/01/2018' DIA , '09:20' HORA FROM DUAL UNION ALL
select 'PIS1' PIS , '01/01/2018' DIA , '13:34' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '01/01/2018' DIA , '03:02' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '01/01/2018' DIA , '04:54' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '01/01/2018' DIA , '22:32' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '03/01/2018' DIA , '01:02' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '03/01/2018' DIA , '09:02' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '03/01/2018' DIA , '09:20' HORA FROM DUAL UNION ALL
select 'PIS2' PIS , '03/01/2018' DIA , '13:34' HORA FROM DUAL
)
, DADOS AS (
SELECT C.PIS
     , C.DIA
     , C.HORA
     , ROW_NUMBER() OVER (PARTITION BY C.PIS, C.DIA ORDER BY C.HORA) LINHA
  FROM COLETA C
  )  
SELECT D.PIS
     , D.DIA
     , MAX(CASE WHEN LINHA = 1 THEN D.HORA END) HORA1
     , MAX(CASE WHEN LINHA = 2 THEN D.HORA END) HORA2
     , MAX(CASE WHEN LINHA = 3 THEN D.HORA END) HORA3
     , MAX(CASE WHEN LINHA = 4 THEN D.HORA END) HORA4
  FROM DADOS D
GROUP BY D.PIS
       , D.DIA
ORDER BY 1,2 
Responder
  • Informação
  • Quem está online

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