Я думаю, что другие примеры намного проще, но здесь есть другой подход, использующий 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'
, что станет одним из значений, на которые вы можете повернуть.