Данные группы Oracle - PullRequest
       1

Данные группы Oracle

2 голосов
/ 27 сентября 2011

У меня есть таблица MyTable в Oracle 11GR2:

COL1 VARCHAR2
COL2 VARCHAR2
COL3 VARCHAR2
COL4 NUMBER

с данными

COL1 COL2   COL3    COL4
A    B      C       1
A    D      E       2
F    G      H       3
F    I      J       4
K    L      M       8

Как получить результаты с помощью SQL:

COL1        COL2    COL3    COL4
K           L       M       8
K           Total           8
F           I       J       4
F           G       H       3
F           Total           7
A           D       E       2
A           B       C       1
A           Total           3
Grand Total                18

Я пробовал с функцией roolup:

SELECT m.col1, m.col2, m.col3, sum(m.col4)
FROM MyTable m
group by rollup(m.col1, (m.col2, m.col3))

Я не знаю, как сортировать, чтобы получить результаты, отсортированные по col4, как в примере выше. Спасибо

Ответы [ 4 ]

1 голос
/ 27 сентября 2011

Есть три функции, которые предоставляют информацию о возвращаемых строках суперагрегата.Этими функциями являются group_id grouping и grouping_id.

Я думаю, что вы хотите использовать здесь grouping.Эта функция сообщит вам, суммируется ли она в данном столбце.Вызов функции для строк с суперагрегатом вернет 1, а другие строки без суперагрегата вернут 0. Подробности о функции группировки можно найти в документации Oracle .

Требуемыйпоказано ниже:

select case when grouping_col1 = 1 then 'Grand Total'
            else col1
       end as col1,
       case when grouping_col1 = 0 and grouping_col2 = 1 then 'Total'
            else col2
       end as col2,
       col3,
       sum_col4,
       grouping_col1,
       grouping_col2
  from (select col1,
               col2,
               col3,
               sum(col4) as sum_col4,
               grouping(col1) as grouping_col1,
               grouping(col2) as grouping_col2
          from mytable
        group by rollup(col1, (col2, col3))
       )
order by grouping_col1,
      sum(sum_col4) over (partition by grouping_col1, grouping_col2, col1) desc,
      grouping_col2,
      sum_col4 desc
1 голос
/ 27 сентября 2011

Я не часто использую ROLLUP, но сложность заключается в том, что после применения ROLLUP нет связи между строками сводки и строками подробностей, поэтому вы не можете легко отсортировать их как группы внутри общего набор результатов, который, как я думаю, вы хотите сделать.

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

select * 
  from (select m.col1, 
               m.col2, 
               m.col3, 
               sum(m.col4) sum_c4
          from mytable m
        group by rollup(m.col1, (m.col2, m.col3))
       )
order by case when col1 is null then 1 
              else 0 
         end asc,                                     -- put grand total line at end of entire set
         sum(sum_c4) over (partition by col1) desc,   -- sort subgroups by descending subtotal
         col1,                                        -- tiebreaker for subgroups with same total
         case when col2 is null then 1 
              else 0 
         end asc,                                     -- put subtotal line at end of each group
         sum_c4 desc                                  -- put detail lines in descending order
0 голосов
/ 27 сентября 2011

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

SELECT COL1 ,COL2,   COL3,    COL4 FROM
(
    SELECT  COL1 ,COL2,   COL3,    COL4 FROM MyTable
    UNION ALL 
    SELECT COL1,'Total', NULL, SUM(COL4) FROM MyTable
    GROUP BY COL1
    ORDER BY 1,3 -- line to change for case discussed below
)
UNION ALL
SELECT 'GRAND TOTAL',NULL,NULL,SUM(COL4) FROM MyTable

Я проверил вышеуказанный запрос на моей машине, и он работает нормально.

В любом случае, если вы получите 'Total' строку перед строкой основной таблицы, тогда отредактируйте последнюю строку как -

ORDER BY 1,3 DESC
0 голосов
/ 27 сентября 2011

Добавить

ORDER BY sum(m.col4) DESC

к вашему запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...