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
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access