Oracle SQL многоуровневые сводные группы - PullRequest
0 голосов
/ 10 июля 2020

РЕДАКТИРОВАТЬ: Для тех, кто говорит, что это ясное и очевидное «Нет»: Конечно, я полагал, что это так, и иерархические заголовки выходили за рамки результатов запроса SQL. Однако, помимо некоторой работы Mysql, я только что совершил прыжок со старой устаревшей платформы SQL Server 2000 на Oracle 12g и обнаружил там вещи, которые я даже представить себе не мог в SS 2000, поэтому я думал, что спрошу. Я пишу множество SQL, чтобы заполнить свой уровень представления в нескольких системах создания отчетов, и поэтому я исследую этот скачок вперед в возможностях SS 2000.

Возможно, я слишком много прошу от Oracle Функция поворота, но это то, что я пытаюсь сделать. Я могу выполнить поворот на одном уровне, но мне нужна иерархия группировки столбцов с несколькими мерами, как это можно было бы легко сделать в кросс-таблице электронной таблицы. Вот пример данных и желаемый результат:

select * 
from(
   select 'A' rws, 'X' cols, 2 v1, 90 v2 from dual union
   select 'A' rws, 'Y' cols, 25 v1, 112 v2 from dual union
   select 'A' rws, 'Y' cols, 7 v1, 64 v2 from dual union
   select 'B' rws, 'X' cols, 4 v1, 117 v2 from dual union
   select 'B' rws, 'Y' cols, 46 v1, 32 v2 from dual union
   select 'B' rws, 'X' cols, 0 v1, 18 v2 from dual
)

Вот результат, который мне нужен:

-----------------------------------------------------------
|             A              |              B             |
-----------------------------------------------------------
|      X      |      Y       |      X       |      Y      |
-----------------------------------------------------------
|  v1  |  v2  |  v1  |  v2   |  v1  |  v2   |  v1  |  v2  |
-----------------------------------------------------------
|  2   |  90  |  32  |  176  |  4   |  135  |  46  |  32  |
-----------------------------------------------------------

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы можете использовать условное агрегирование следующим образом:

SQL> SELECT SUM(CASE WHEN RWS = 'A' AND COLS = 'X' THEN V1 END) AS AXV1,
  2         SUM(CASE WHEN RWS = 'A' AND COLS = 'X' THEN V2 END) AS AXV2,
  3         SUM(CASE WHEN RWS = 'A' AND COLS = 'Y' THEN V1 END) AS AYV1,
  4         SUM(CASE WHEN RWS = 'A' AND COLS = 'Y' THEN V2 END) AS AYV2,
  5         SUM(CASE WHEN RWS = 'B' AND COLS = 'X' THEN V1 END) AS BXV1,
  6         SUM(CASE WHEN RWS = 'B' AND COLS = 'X' THEN V2 END) AS BXV2,
  7         SUM(CASE WHEN RWS = 'B' AND COLS = 'Y' THEN V1 END) AS BYV1,
  8         SUM(CASE WHEN RWS = 'B' AND COLS = 'Y' THEN V2 END) AS BYV2
  9  FROM YOUR_TABLE;

      AXV1       AXV2       AYV1       AYV2       BXV1       BXV2       BYV1       BYV2
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         2         90         32        176          4        135         46         32

SQL>

Отображение многострочных заголовков должно осуществляться со стороны приложения.

0 голосов
/ 10 июля 2020

Конечно, вы можете сводить данные по своему усмотрению, но вам нужно отформатировать заголовок самостоятельно, так как, очевидно, Oracle возвращает стандартные данные таблицы:

select * 
from(
   select 'A' rws, 'X' cols, 2 v1, 90 v2 from dual union
   select 'A' rws, 'Y' cols, 25 v1, 112 v2 from dual union
   select 'A' rws, 'Y' cols, 7 v1, 64 v2 from dual union
   select 'B' rws, 'X' cols, 4 v1, 117 v2 from dual union
   select 'B' rws, 'Y' cols, 46 v1, 32 v2 from dual union
   select 'B' rws, 'X' cols, 0 v1, 18 v2 from dual
) t
pivot 
(
   max(v1) as v1_,max(v2) as v2_
   for (rws,cols) in (
       ('A','X') as A_X,
       ('A','Y') as A_Y,
       ('B','X') as B_X,
       ('B','Y') as B_Y
   )
);

Результат:

   A_X_V1_    A_X_V2_    A_Y_V1_    A_Y_V2_    B_X_V1_    B_X_V2_    B_Y_V1_    B_Y_V2_
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         2         90         25        112          4        117         46         32
...