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
  

Mensagemem Sex, 15 Jun 2018 1:32 am

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

Código: Selecionar todos
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
;
brunomruiz
Localização: Bebedouro - SP

Mensagemem Sex, 15 Jun 2018 8:13 am

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?
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Seg, 25 Jun 2018 10:42 am

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.
brunomruiz
Localização: Bebedouro - SP

Mensagemem Ter, 26 Jun 2018 9:17 am

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?f=3&t=10571&p=41564&hilit=pivot#p41564

http://glufke.net/oracle/viewtopic.php?f=2&t=10584&p=41600&hilit=pivot#p41600
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Dom, 08 Jul 2018 5:55 pm

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?f=3&t=10571&p=41564&hilit=pivot#p41564

http://glufke.net/oracle/viewtopic.php?f=2&t=10584&p=41600&hilit=pivot#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.
brunomruiz
Localização: Bebedouro - SP

Mensagemem Qua, 11 Jul 2018 3:15 pm

Então é limitado a 4 horários os resgistros? Ou pode ter mais do que 4 para cada Data / PIS?
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Qua, 11 Jul 2018 4:54 pm

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.
brunomruiz
Localização: Bebedouro - SP

Mensagemem Sex, 13 Jul 2018 3:07 pm

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.

Código: Selecionar todos
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
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.



Voltar para PL/SQL

Quem está online

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

cron