- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 7 anos, 11 meses atrás por
José Laurindo Chiappa.
-
AutorPosts
-
2 de junho de 2017 às 3:49 am #108774
sandro
ParticipanteBoa noite. Estou precisando de uma idéia na seguinte situação.
A tabela abaixo apresenta um valor(a,b,c…) para cada um dos dias da semana em uma determinada hora:HORA SEGUNDA TERCA QUARTA QUINTA SEXTA
1 – A – – –
1 – – – – B
1 C – – – –
2 D – – – –
2 – E – – –
2 – – F – –
2 – – – G –
3 H – – – –
3 – – – I –
3 – – – – JEu preciso que ela fique agrupada pelo valor da coluna hora, assim:
HORA SEGUNDA TERCA QUARTA QUINTA SEXTA
1 C A – – B
2 D E F G –
3 H – – I JAlguém me dá uma dica por favor?
2 de junho de 2017 às 3:27 pm #108775spernega
ParticipanteBom dia Sandro,
Para essa estrutura de dados você pode fazer assim:
with x as
( select 1 hora, null segunda, ‘A’ terca, null quarta, null quinta, null sexta from dual
union all
select 1, null, null, null, null, ‘B’ from dual
union all
select 1, ‘C’, null, null, null, null from dual
union all
select 2, ‘D’, null, null, null, null from dual
union all
select 2, null, ‘E’, null, null, null from dual
union all
select 2, null, null, ‘F’, null, null from dual
union all
select 2, null, null, null, ‘G’, null from dual
union all
select 3, ‘H’, null, null, null, null from dual
union all
select 3, null, null, null, ‘I’, null from dual
union all
select 3, null, null, null, null, ‘J’ from dual)
select hora, max(segunda) segunda, max(terca) terca, max(quarta) quarta, max(quinta) quinta, max(sexta) sexta
from x
group by hora;2 de junho de 2017 às 4:28 pm #108776spernega
ParticipanteSe você estiver usando o banco 11 ou acima, pode usar o listagg.
Caso tenha mais de um valor para a mesma hora no mesmo dia.with x as
( select 1 hora, null segunda, ‘A’ terca, null quarta, null quinta, null sexta from dual
union all
select 1, ‘Z’, null, null, null, ‘B’ from dual
union all
select 1, ‘C’, null, null, null, null from dual
union all
select 2, ‘D’, null, null, null, null from dual
union all
select 2, null, ‘E’, null, null, null from dual
union all
select 2, null, null, ‘F’, null, null from dual
union all
select 2, null, null, null, ‘G’, null from dual
union all
select 3, ‘H’, null, null, null, null from dual
union all
select 3, null, null, null, ‘I’, null from dual
union all
select 3, null, null, null, null, ‘J’ from dual)
select hora,
substr(listagg(segunda) WITHIN GROUP (ORDER BY segunda),1,10) segunda,
substr(listagg(terca) WITHIN GROUP (ORDER BY terca),1,10) terca,
substr(listagg(quarta) WITHIN GROUP (ORDER BY quarta),1,10) quarta,
substr(listagg(quinta) WITHIN GROUP (ORDER BY quinta),1,10) quinta,
substr(listagg(sexta) WITHIN GROUP (ORDER BY sexta),1,10) sexta
from x
group by hora;2 de junho de 2017 às 5:20 pm #108777sandro
ParticipanteUsei o select(max) com o group by da tua primeira solução e já funcionou direto.
Muito obrigado.Achei que ia precisar fazer um PL, inserindo em uma tabela temporária.. mas a tua solução foi perfeita.
Valeu mesmo.
2 de junho de 2017 às 5:26 pm #108778José Laurindo Chiappa
Moderador+1 aqui recomendando LISTAGG, ela é Facílima de usar, tá presente iirc em TODAS as Editions do 11g (até na XE gratuita) e é Performática…. A única coisa é que, como TODAS as funções básicas de string no RDBMS Oracle, ela tá LIMITADA A 4000 caracteres , não esquecer disso… Mas se há 100% de certeza que os dados não chegam nesse limite, é com ela que vc vai…
[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.