Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #94500
    eversonpiza
    Participante

      Olá amigos,

      Estou fazendo um select em várias colunas e apenas duas delas são númericas, preciso que seja ‘criada’ uma linha no final do select somando o valor destas duas colunas, sem sub-totais. Tentei usar ROLLUP e CUBE mas não consegui o resultado esperado, pois eles totalizam para cada valor chave.

      Segue um caso de teste do que estou falando.


      create table teste_agrupamento(x1 varchar2(5), x2 varchar2(5), x3 varchar2(5), n1 number, n2 number);

      insert into teste_agrupamento values ('A','Y','A',1,2);
      insert into teste_agrupamento values ('A','T','D',2,3);
      insert into teste_agrupamento values ('B','E','U',3,4);
      insert into teste_agrupamento values ('C','D','J',4,6);
      insert into teste_agrupamento values ('E','A','W',5,7);

      COM ROLLUP


      select x1,x2,x3,sum(n1),sum(n2) from teste_agrupamento group by rollup(x1,x2,x3);

      X1 X2 X3 SUM(N1) SUM(N2)
      ----- ----- ----- ---------- ----------
      A T D 2 3
      A T 2 3
      A Y A 1 2
      A Y 1 2
      A 3 5
      B E U 3 4
      B E 3 4
      B 3 4
      C D J 4 6
      C D 4 6
      C 4 6
      E A W 5 7
      E A 5 7
      E 5 7
      15 22

      COM CUBE

      select x1,x2,x3,sum(n1),sum(n2) from teste_agrupamento group by cube(x1,x2,x3);

      X1 X2 X3 SUM(N1) SUM(N2)
      ----- ----- ----- ---------- ----------
      15 22
      A 1 2
      D 2 3
      J 4 6
      U 3 4
      W 5 7
      A 5 7
      A W 5 7
      D 4 6
      D J 4 6
      E 3 4
      E U 3 4
      T 2 3
      T D 2 3
      Y 1 2
      Y A 1 2
      A 3 5
      A A 1 2
      A D 2 3
      A T 2 3
      A T D 2 3
      A Y 1 2
      A Y A 1 2
      B 3 4
      B U 3 4
      B E 3 4
      B E U 3 4
      C 4 6
      C J 4 6
      C D 4 6
      C D J 4 6
      E 5 7
      E W 5 7
      E A 5 7
      E A W 5 7

      Oq eu quero seria isso:


      X1 X2 X3 N1 N2
      ----- ----- ----- ---------- ----------
      A Y A 1 2
      A T D 2 3
      B E U 3 4
      C D J 4 6
      E A W 5 7
      15 22

      Vocês podem me ajudar?

      Obrigado.
      Everson

      #94504
      fsitja
      Participante

        Olá,

        Obrigado por postar o código para testarmos, facilita muito! 😀

        Para atender sua necessidade, dá para usar grouping sets:


        Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0
        Connected as fsitja

        SQL> SELECT x1, x2, x3, SUM(n1), SUM(n2)
        2 FROM teste_agrupamento
        3 GROUP BY GROUPING SETS ((x1, x2, x3),());

        X1 X2 X3 SUM(N1) SUM(N2)


        A T D 2 3
        A Y A 1 2
        B E U 3 4
        C D J 4 6
        E A W 5 7
        15 22

        6 rows selected

        #94506
        eversonpiza
        Participante

          Olá,

          Eu que agradeço a ajuda, funcionou perfeitamente. 😀

          Obrigado.

          #94507
          burga
          Participante

            isso deve resolver…
            select * from (select x1,x2,x3,n1,n2 from teste_agrupamento
            union all
            select null, null, null, sum(n1), sum(n2) from teste_agrupamento)
            order by 4;

            edit:

            atrasei… 😆

            #94512
            fsitja
            Participante

              [quote=”burga”:1c49agdh]isso deve resolver…
              select * from (select x1,x2,x3,n1,n2 from teste_agrupamento
              union all
              select null, null, null, sum(n1), sum(n2) from teste_agrupamento)
              order by 4;

              edit:

              atrasei… 😆 [/quote]

              hehe, é apenas outra forma de pedir a mesma coisa pro Oracle 😉

              No link abaixo dos Docs:
              http://download.oracle.com/docs/cd/E118 … #DWHSG8631

              GROUPING SETS Syntax

              GROUPING SETS syntax lets you define multiple groupings in the same query. GROUP BY computes all the groupings specified and combines them with “UNION ALL”. For example, consider the following statement:

              GROUP BY GROUPING sets (channel_desc, calendar_month_desc, country_id )

              This statement is equivalent to:

              GROUP BY channel_desc “UNION ALL”
              GROUP BY calendar_month_desc “UNION ALL” GROUP BY country_id

              A diferença é que o Grouping Sets vai fazer um único scan na tabela, sendo um pouco mais eficiente.

              Quanto ao uso de rollup, pode ser feito também para chegar no resultado, mas, de novo, o desempenho vai ser inferior pois ele vai calcular os subtotais ao longo de todas dimensões para depois descartá-los no having:

              SQL> SELECT x1, x2, x3, SUM(n1), SUM(n2)
              2 FROM teste_agrupamento
              3 GROUP BY ROLLUP (x1, x2, x3)
              4 HAVING GROUPING(x1) + GROUPING(x2) + GROUPING(x3) = 0
              5 OR GROUPING(x1) + GROUPING(x2) + GROUPING(x3) = 3;

              X1 X2 X3 SUM(N1) SUM(N2)


              A T D 2 3
              A Y A 1 2
              B E U 3 4
              C D J 4 6
              E A W 5 7
              15 22

              6 rows selected

              edit: o fórum dá erro quando tento postar as palavras “UNION ALL” sem as aspas.

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