Обеспечение правильности результатов

Использование GROUP BY в составных запросах

В отличие от ORDER BY, ключевое слово GROUP BY можно использовать не только в любом из входящих в составной запрос операторе SELECT, но и для всего составного запроса в целом, разместив GROUP BY в конце. Кроме того, вместе с GROUP BY в любом из входящих в составной запрос операторе SELECT можно использовать ключевое слово HAVING (которое иногда используется с GROUP BY).

Синтаксис оператора с использованием GROUP BY должен быть следующим.

SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ] [GROUP BY ] [HAVING ]

КОМАНДА{UNION | EXCEPT | INTERSECT | UNION ALL}

SELECT столбец1 [, столбец2 ] FROM таблица1 [, таблица2 ] [ WHERE ] [ GROUP BY ] [ HAVING ]

[ ORDER BY ]

В следующем примере выбираются буквальные символьные строки, представляющие записи о заказчиках, служащих и товарах. Каждый из входящих в оператор запросов просто подсчитывает число всех записей соответствующей таблицы. В выражении GROUP BY задается группирование выводимых данных по столбцу номер 1.

SELECT 'ЗАКАЗЧИКИ' TYPE, COUNT (*)

FROM CUSTOMER_TBL

UNION

SELECT 'СЛУЖАЩИЕ' TYPE, COUNT (*)

FROM EMPLOYEE_TBL

UNION

SELECT 'ТОВАРЫ' TYPE, COUNT (*)

FROM PRODUCTS_TBL

GROUP BY 1;

TYPE COUNT(*)

ЗАКАЗЧИКИ 15

СЛУЖАЩИЕ 6

ТОВАРЫ 11

Следующий запрос возвращает те же данные, но в нем дополнительно используется ключевое слово ORDER BY.

SELECT 'ЗАКАЗЧИКИ' TYPE, COUNT (*)

FROM CUSTOMER_TBL

UNION

SELECT 'СЛУЖАЩИЕ' TYPE, COUNT (*)

FROM EMPLOYEE_TBL

UNION

SELECT 'ТОВАРЫ' TYPE, COUNT (*)

FROM PRODUCTS_TBL

GROUP BY 1 ORDER BY 2;

TYPE COUNT(*)

СЛУЖАЩИЕ 6

ТОВАРЫ 11

ЗАКАЗЧИКИ 15

Здесь выведенные данные отсортированы по столбцу 2, представляющем результаты подсчетов. Поэтому числа во втором столбце оказываются упорядоченными от меньшего к большему.

В InterBase следует воспользоваться следующим вариантом:

SELECT CAST ('ЗАКАЗЧИКИ' as CHAR (10)) TYPE_, COUNT (*)

FROM CUSTOMER_TBL

UNION

SELECT CAST ('СЛУЖАЩИЕ' as CHAR (10)) TYPE_, COUNT (*)

FROM EMPLOYEE_TBL

UNION

SELECT CAST ('ТОВАРЫ' as CHAR (10)) TYPE_, COUNT (*)

FROM PRODUCTS_TBL

order BY 2, 1;

При использовании составных операторов следует быть предельно внимательными. Например, если в составном операторе с использованием команды INTERSECT неправильно задать первый из операторов SELECT, в результате можно получить либо неполные, либо вообще неверные данные. Кроме того, всегда ли нужно исключать повторения, как это делает команда UNION, или наоборот, отображать все повторения, как это делает команда UNION ALL Необходимо ли видеть все строки, не входящие в результат второго запроса при использовании команды EXCEPT? Как видите, неправильно составленный составной запрос или неправильный порядок запросов, входящих в составной, легко может привести к неправильным результатам

Неполные данные при выводе тоже квалифицируются как неправильные данные.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: