Глава 8. Группировка и агрегаты
| CD | 2 | 8000.00 |
| CD | NULL | 19500.00 |
| CHK | 1 | 782.16 |
| CHK | 2 | 3315.77 |
| CHK | 3 | 1057.75 |
| CHK | 4 | 67852.33 |
| CHK | NULL | 73008.01 |
| MM | 1 | 14832.64 |
| MM | 3 | 2212.50 |
| MM | NULL | 17045.14 |
| SAV | 1 | 767.77 |
| SAV | 2 | 700.00 |
| SAV | 4 | 387.99 |
| SAV | NULL | 1855.76 |
| SBL | 3 | 50000.00 |
| SBL | NULL | 50000.00 |
| NULL | NULL | 170754.46 |
++++
21 rows in set (0.02 sec)
Теперь имеется семь дополнительных результатов, по одному для каж
дого из шести разных типов счетов, и один – общая сумма (для всех ти
пов счетов). Для шести обобщений по типам счетов столбец
open_
branch_id
содержит значение
null
, поскольку обобщение осуществляет
ся по всем отделениям. Например, взглянув на строку #3 результата,
можно заметить, что всего по счетам BUS во всех отделениях внесено
9 345,55 долларов. Строка итоговой суммы в обоих столбцах,
prod
uct_cd
и
open_branch_id
, содержит значение
null
. Последняя строка вы
ходных данных показывает общую сумму 170 754,46 долларов для
всех типов счетов и всех отделений.
При работе с Oracle Database для выполнения обобщения приме
няется немного отличающийся синтаксис. Блок
group by
из пре
дыдущего запроса при использовании в Oracle выглядел бы так:
GROUP BY ROLLUP(product_cd, open_branch_id)
Преимущество этого синтаксиса в том, что он позволяет выпол
нять обобщения для подмножества столбцов в блоке
group
by
.
Например, если группировка осуществляется по столбцам
a
,
b
и
c
, можно было бы указать, что сервер должен проводить обоб
щения только для
b
и
c
:
GROUP BY a, ROLLUP(b, c)
Если кроме суммы по типам счетов требуется подсчитать сумму по каж
дому отделению, можно использовать вариант
with
cube
, который фор
мирует строки суммы для
всех возможных сочетаний группирующих
столбцов. К сожалению,
with
cube
недоступен в MySQL версии 4.1, но
есть в SQL Server и Oracle Database. Вот пример использования
with
cube
(я убрал приглашение
mysql>
, чтобы показать, что этот запрос пока
нельзя осуществить в MySQL):