Мы показали, как можно вычислить массу определенного продукта, поставляемого поставщиками. Предположим, что теперь требуется вычислить общую массу каждого из продуктов, поставляемых в настоящее время поставщиками. Это можно легко сделать с помощью предложения
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.