Как включить итоги строк в сводную инструкцию в Oracle? - PullRequest
2 голосов
/ 30 января 2020

У меня есть таблица данных, см. Использование оператора сводки, я могу разбить счет по заголовку

select * from (
  select * from ta
)
pivot (
COUNT(title)
 for title in ( 'worker', 'manager') )

Таким образом, результат выглядит так:

STATUS    'worker'  'manager'
started   3         1
finished  4         5
ready     3         4

Что мне нужно добавить третий столбец для итогов строки

STATUS    'worker'  'manager'  Total
started   3         1          4
finished  4         5          9
ready     3         4          7

Любая идея, как я могу выполнить sh это в том же утверждении? демоверсия на http://sqlfiddle.com/#! 4 / 740fd / 1

Ответы [ 4 ]

0 голосов
/ 31 января 2020

Я думаю, что другие примеры намного проще, но здесь есть другой подход, использующий cube и grouping перед поворотом:

select *
from (
select decode(grouping(title),1,'total',0,title) title,
       status,
       count(*) cnt
from ta
group by status, cube(title) )
pivot(
  sum(cnt) for title in ('worker','manager','total')
)

Вывод:

|   STATUS | 'worker' | 'manager' | 'total' |
|----------|----------|-----------|---------|
| finished |        4 |         5 |       9 |
|    ready |        3 |         4 |       7 |
|  started |        3 |         1 |       4 |

http://sqlfiddle.com/#! 4 / 740fd / 13/0

Добавление cube в предложение group by даст вам промежуточный итог для этого столбца. По умолчанию он будет отображаться как ноль в этом столбце. Вы можете использовать функцию grouping в предложении выбора, чтобы различать общую строку и обычные строки (общая строка будет 1, обычные строки 0). Использование декодирования приведет к тому, что общее количество строк будет равно 'total', что станет одним из значений, на которые вы можете повернуть.

0 голосов
/ 30 января 2020

Используйте функцию SUM () analyti c для получения суммы, а затем используйте PIVOT

select 
    status,
    sum(case 
        when title = 'worker' 
          then 1 
            else 0
        end) worker,
    sum(case
        when title = 'manager' 
          then 1 
            else 0 
        end) manager,
    count(*) total
from ta
group by status

enter image description here

0 голосов
/ 30 января 2020

Укажите псевдоним для всего запроса (например, q), чтобы квалифицировать все столбцы звездочкой (q.*), а затем суммируйте все столбцы, чтобы получить столбец total рядом с ним:

select q.*, worker + manager as total 
  from ta
 pivot 
 (
  count(title)
  for title in ( 'worker' as worker, 'manager' as manager ) 
 ) q

Демо

0 голосов
/ 30 января 2020

Я бы просто использовал условное агрегирование, а не pivot. Это дает вам дополнительную гибкость, которая вам необходима:

select 
    status,
    sum(case when title = 'worker'  then 1 else 0 end) worker,
    sum(case when title = 'manager' then 1 else 0 end) manager,
    count(*) total
from ta
group by status

Демонстрация на DB Fiddle :

STATUS   | WORKER | MANAGER | TOTAL
:------- | -----: | ------: | ----:
started  |      3 |       1 |     4
finished |      4 |       5 |     9
ready    |      3 |       4 |     7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...