Pular para o conteúdo
  • Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 7 anos, 5 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #108774
    Avatar de sandrosandro
    Participante

      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 – – – – J

      Eu 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 J

      Alguém me dá uma dica por favor?

      #108775
      Avatar de spernegaspernega
      Participante

        Bom 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;

        #108776
        Avatar de spernegaspernega
        Participante

          Se 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;

          #108777
          Avatar de sandrosandro
          Participante

            Usei 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.

            #108778
            Avatar photoJosé 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

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.
            plugins premium WordPress