Читайте также:
|
|
В предыдущем примере все значения, возвращаемые по запросу, фор_ мируются агрегатной функцией, а сами агрегатные функции применя_ ются к группе строк, определенной условием фильтрации product_cd =
Агрегатные функции | |
'CHK'. Поскольку блок group by отсутствует, имеется единственная не_ явная группа (все возвращенные запросом строки).
Однако в большинстве случаев потребуется извлекать и другие столбцы, а не только сформированные агрегатными функциями. Что если, к при_ меру, заставить предыдущий запрос выполнить эти же пять агрегатных функций для каждого типа счетов, а не только для текущих счетов? Для такого запроса пришлось бы извлекать столбец product_cd в дополнение к столбцам, сформированным пятью агрегатными функциями:
SELECT product_cd,
MAX(avail_balance) max_balance,
MIN(avail_balance) min_balance,
AVG(avail_balance) avg_balance,
SUM(avail_balance) tot_balance,
COUNT(*) num_accounts
FROM account;
Однако если попытаться выполнить этот запрос, будет получена сле_ дующая ошибка:
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
with no GROUP columns is illegal if there is no GROUP BY clause
Хотя для разработчика очевидно, что он хочет применить агрегатные функции к множеству счетов каждого типа, выявленного в таблице account, этот запрос дает сбой, потому что не был явно задан способ груп_ пировки данных. Следовательно, необходимо добавить блок group by и определить в нем группу строк, к которой следует применять агре_ гатные функции:
mysql> | SELECT product_cd, |
_> | MAX(avail_balance) max_balance, |
_> | MIN(avail_balance) min_balance, |
_> | AVG(avail_balance) avg_balance, |
_> | SUM(avail_balance) tot_balance, |
_> | COUNT(*) num_accts |
_> | FROM account |
_> | GROUP BY product_cd; |
+___________+____________+____________+____________+____________+__________+ | product_cd | max_balance | min_balance | avg_balance | tot_balance | num_accts | +___________+____________+____________+____________+____________+__________+
| BUS | | | 9345.55 | | | 0.00 | | 4672.774902 | | 9345.55 | | | | | ||
| CD | | | 10000.00 | | | 1500.00 | | 4875.000000 | | | 19500.00 | | | | | |
| CHK | | | 38552.05 | | | 122.37 | | 7300.800985 | | | 73008.01 | | | | | |
| MM | | | 9345.55 | | | 2212.50 | | 5681.713216 | | | 17045.14 | | | | | |
| SAV | | | 767.77 | | | 200.00 | | 463.940002 | | | 1855.76 | | | | | |
| SBL | | | 50000.00 | | | 50000.00 | | 50000.000000 | | 50000.00 | | 1 | |
+___________+____________+____________+____________+____________+__________+ 6 rows in set (0.00 sec)
158 Глава 8. Группировка и агрегаты
Если есть блок group by, сервер знает, что сначала надо сгруппировать строки с одинаковым значением в столбце product_cd, а затем приме_ нить пять агрегатных функций к каждой из шести групп.
Дата добавления: 2015-08-17; просмотров: 48 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Агрегатные функции | | | Gt; FROM account |