158
Глава 8. Группировка и агрегаты
Если есть блок
group
by
, сервер знает, что сначала надо сгруппировать
строки с одинаковым
значением в столбце
product_cd
, а затем приме
нить пять агрегатных функций к каждой из шести групп.
Подсчет уникальных значений
При использовании функции
count()
для определения числа членов
в каждой группе существует выбор:
или пересчитать
все
члены груп
пы, или посчитать только
уникальные
(
distinct
) значения столбца из
всех членов группы. Рассмотрим, например,
следующие данные, кото
рыми представлены сотрудники, ответственные за открытие каждого
счета:
mysql>
SELECT account_id, open_emp_id
> FROM account
> ORDER BY open_emp_id;
+++
| account_id | open_emp_id |
+++
| 8 | 1 |
| 9 | 1 |
| 10 | 1 |
| 12 | 1 |
| 13 | 1 |
| 17 | 1 |
| 18 | 1 |
| 19 | 1 |
| 1 | 10 |
| 2 | 10 |
| 3 | 10 |
| 4 | 10 |
| 5 | 10 |
| 14 | 10 |
| 22 | 10 |
| 6 | 13 |
| 7 | 13 |
| 24 | 13 |
| 11 | 16 |
| 15 | 16 |
| 16 | 16 |
| 20 | 16 |
| 21 | 16 |
| 23 | 16 |
+++
24 rows in set (0.00 sec)
Как видите, все множество счетов было открыто четырьмя разными
сотрудниками (с ID = 1, 10, 13 и 16).
Допустим, хочется подсчитать
число открывших счета сотрудников – не вручную, а с помощью за
проса. Если к столбцу
open_emp_id
применить функцию
count()
,
увидим
следующие результаты:
Агрегатные функции
159
mysql>
SELECT COUNT(open_emp_id)
> FROM account;
++
| COUNT(open_emp_id) |
++
| 24 |
++
1 row in set (0.00 sec)
В этом случае столбец
open_emp_id
задан как столбец,
который должен
быть пересчитан. При этом полученный результат ничем не отличает
ся от результата выполнения функции
count(*)
. Если требуется под
считать
уникальные
значения в группе, а не
просто пересчитать число
строк в ней, нужно указать ключевое слово
distinct
:
mysql>
SELECT COUNT(DISTINCT open_emp_id)
> FROM account;
++
| COUNT(DISTINCT open_emp_id) |
++
| 4 |
++
1 row in set (0.00 sec)
Следовательно, если задано ключевое слово
distinct
, функция
count()
проверит значение столбца
для каждого члена группы, а не просто
подсчитает число значений в ней.
Достарыңызбен бөлісу: