Структуризированный язык запросов (SQL)


Фраза GROUP BY


Мы показали, как можно вычислить массу определенного продукта, поставляемого поставщиками. Предположим, что теперь требуется вычислить общую массу каждого из продуктов, поставляемых в настоящее время поставщиками. Это можно легко сделать с помощью предложения

SELECT ПР, SUM(К_во) FROM Поставки GROUP BY ПР;

Результат показан на рис. 2.3,а.

а) б) в) г)
ПР

90 11150 1230 15370 1370 3250 5170 6220 8150 7200 20 4100 13190 1470 16250 1750 10220 ПСПРЦенаК_во . . .

Рис. 2.3. Иллюстрации к фразе GROUP BY

Фраза GROUP BY (группировать по) инициирует перекомпоновку указанной во FROM таблицы по группам, каждая из которых имеет одинаковые значения в столбце, указанном в GROUP BY. В рассматриваемом примере строки таблицы Поставки группируются так, что в одной группе содержатся все строки для продукта с ПР = 1, в другой – для продукта с ПР = 2 и т.д. (см. рис. 2.3.б). Далее к каждой группе применяется фраза SELECT. Каждое выражение в этой фразе должно принимать единственное значение для группы, т.е. оно может быть либо значением столбца, указанного в GROUP BY, либо арифметическим выражением, включающим это значение, либо константой, либо одной из SQL-функций, которая оперирует всеми значениями столбца в группе и сводит эти значения к единственному значению (например, к сумме).

Отметим, что фраза GROUP BY не предполагает ORDER BY. Чтобы гарантировать упорядочение по ПР результата рассматриваемого примера (рис. 2.3,в) следует дать запрос

SELECT ПР, SUM(К_во) FROM Поставки GROUP BY ПР ORDER BY ПР;


Наконец, отметим, что строки таблицы можно группировать по любой комбинации ее столбцов. Так, по запросу

SELECT Т, БЛ, COUNT(БЛ) FROM Заказ GROUP BY Т, БЛ;

можно узнать коды и количество порций блюд, заказанных отдыхающими пансионата (32 человека) на каждую из трапез следующего дня:

19-0--0-
39-0--0-
59-0--0-
1111.5050
511-0--0-
611-0--0-
8111.00100
1123.0010
3122.5020
612-0--0-
1152.00170
3151.50200
213.60300
714.2070
23-0--0-
734.00250
ПР
1370
20
3250
4100
5170
6220
7200
8150
90
10220
11150
1230
13190
1470
15370
16250
1750
ПР
90
11150
1230
1570
1370
3250
570
6140
8150
7200
20
4100
13190
1470
16250
1750
10220
ТБЛCOUNT(БЛ) ... Если в запросе используются фразы WHERE и GROUP BY, то строки, не удовлетворяющие фразе WHERE, исключаются до выполнения группирования.

Например, выдать для каждого продукта его код и общий объем возможных поставок, учитывая временную недееспособность поставщика с ПС=2:

SELECT ПР, SUM(К_во) FROM Поставки WHERE ПС <> 2 GROUP BY ПР;

Результат, приведенный на рис. 2.3,г, отличается от результата (рис. 2.3,а) аналогичного запроса для всех поставщиков объемом поставок продуктов с кодами 15, 5 и 6.

2.5.2 | Содержание | 2.5.4


Содержание раздела






1318
1 6 14
1 19 17
121 15