2.5.3. Фраза GROUP BY
Мы показали, как можно вычислить массу
определенного продукта, поставляемого поставщиками. Предположим, что
теперь требуется вычислить общую массу каждого из продуктов,
поставляемых в настоящее время поставщиками. Это можно легко сделать с
помощью предложения
SELECT ПР, SUM(К_во) FROM Поставки GROUP BY ПР;
Результат показан на рис. 2.3,а.
а) |
б) |
в) |
г) |
ПР |
9 |
0 |
11 |
150 |
12 |
30 |
15 |
370 |
1 |
370 |
3 |
250 |
5 |
170 |
6 |
220 |
8 |
150 |
7 |
200 |
2 |
0 |
4 |
100 |
13 |
190 |
14 |
70 |
16 |
250 |
17 |
50 |
10 |
220 |
|
ПС |
ПР |
Цена |
К_во |
1 |
9 |
-0- |
-0- |
3 |
9 |
-0- |
-0- |
5 |
9 |
-0- |
-0- |
1 |
11 |
1.50 |
50 |
5 |
11 |
-0- |
-0- |
6 |
11 |
-0- |
-0- |
8 |
11 |
1.00 |
100 |
1 |
12 |
3.00 |
10 |
3 |
12 |
2.50 |
20 |
6 |
12 |
-0- |
-0- |
1 |
15 |
2.00 |
170 |
3 |
15 |
1.50 |
200 |
2 |
1 |
3.60 |
300 |
7 |
1 |
4.20 |
70 |
2 |
3 |
-0- |
-0- |
7 |
3 |
4.00 |
250 |
. . . |
|
ПР |
1 |
370 |
2 |
0 |
3 |
250 |
4 |
100 |
5 |
170 |
6 |
220 |
7 |
200 |
8 |
150 |
9 |
0 |
10 |
220 |
11 |
150 |
12 |
30 |
13 |
190 |
14 |
70 |
15 |
370 |
16 |
250 |
17 |
50 |
|
ПР |
9 |
0 |
11 |
150 |
12 |
30 |
15 |
70 |
1 |
370 |
3 |
250 |
5 |
70 |
6 |
140 |
8 |
150 |
7 |
200 |
2 |
0 |
4 |
100 |
13 |
190 |
14 |
70 |
16 |
250 |
17 |
50 |
10 |
220 |
|
Рис. 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 человека) на каждую из
трапез следующего дня:
Т |
БЛ |
COUNT(БЛ) |
1 |
3 |
18 |
1 |
6 |
14 |
1 |
19 |
17 |
1 |
21 |
15 |
... |
Если в запросе используются фразы 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
|