Получение итоговых данных с помощью оператора ROLLUP |
|||||||||||||
Посчитаем сумму прихода на каждый из пунктов по таблице Income. Это несложно сделать при помощи запроса Пусть наряду с этим нам требуется вывести сумму по всем пунктам, т.е. результат должен выглядеть так:
Для решения подобной задачи в операторе SELECT имеется спецификация ROLLUP. С её помощью достичь требуемого результата не составляет труда:
Поскольку значения столбца должны быть одного типа, номер пункта приёма приводится к символьному типу. Последний запрос можно переписать в иной (стандартной) синтаксической форме:
Вместо ROLLUP в нашем запросе можно также использовать оператор CUBE:
Подробно о различиях между этими двумя операторами вы можете почитать в статье Бена Ричардсона. Если СУБД не поддерживает конструкцию ROLLUP, можно использовать либо UNION, либо внешнее соединение (FULL JOIN), что позволяет объединить два запроса в один. Ниже приводятся эти решения. UNION
FULL JOIN
В последнем решении следует обратить внимание на то, что соединение выполняется по заведомо ложному предикату, т.к. нам нужны строки из обеих таблиц, которые бы не конкатенировались друг с другом. Рекомендуемые упражнения: 120 |