Dividing a Summary into Subgroups
Problem
You want to calculate a summary for each subgroup of a set of rows, not an overall summary value.
Solution
Use a GROUP
BY
clause to arrange
rows into groups.
Discussion
The summary queries shown so far calculate summary values over all
rows in the result set. For example, the following query determines
the number of daily driving records in the
driver_log
table, and thus the total number of
days that drivers were on the road:
mysql> SELECT COUNT(*) FROM driver_log;
+----------+
| COUNT(*) |
+----------+
| 10 |
+----------+
But sometimes it’s desirable to break a set of rows
into subgroups and summarize each group. This is done by using
aggregate functions in conjunction
with a GROUP
BY
clause. To
determine the number of days driven by each driver, group the rows by
driver name, count how many rows there are for each name, and display
the names with the counts:
mysql> SELECT name, COUNT(name) FROM driver_log GROUP BY name;
+-------+-------------+
| name | COUNT(name) |
+-------+-------------+
| Ben | 3 |
| Henry | 5 |
| Suzi | 2 |
+-------+-------------+
That query summarizes the same column used for grouping
(name
), but that’s not always
necessary. Suppose you want a quick characterization of the
driver_log
table, showing for each person listed
in it the total number of miles driven and the average number of
miles per day. In this case, you still use the
name
column to place the rows in groups, but the
summary functions operate on the miles
Get MySQL Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.