- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 7 anos, 5 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
2 de junho de 2017 às 3:49 am #108774sandroParticipante
Boa 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 #108775spernegaParticipanteBom 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 #108776spernegaParticipanteSe 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 #108777sandroParticipanteUsei 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 ChiappaModerador+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.