Суммы и средние значения
COUNT считает, а SUM складывает. SUM(column) складывает значения столбца во всех найденных строках, а AVG(column) даёт их среднее: сумму, делённую на количество значений. Если бы вы купили по одному экземпляру каждой игры магазина, вы заплатили бы:
SELECT SUM(price) AS all_games,
AVG(price) AS average_price
FROM games;| all_games | average_price |
|---|---|
| 570 | 28.5 |
Помните из урока о функциях, что 7 / 2 равно 3, потому что оба числа целые? AVG так не делает: она всегда возвращает десятичное число, даже если все значения целые. А у среднего часто много знаков после запятой, поэтому его обычно округляют с помощью ROUND. Вот средняя цена в order_items, как она есть и округлённая:
SELECT AVG(price) AS average_paid,
ROUND(AVG(price), 2) AS rounded
FROM order_items;| average_paid | rounded |
|---|---|
| 28.3333333333333 | 28.33 |
В скобках можно написать любое выражение, а не только столбец. База данных вычисляет его для каждой строки, а потом складывает результаты. Так считают стоимость заказов. В order_items в каждой строке есть количество экземпляров и цена одного экземпляра, поэтому строка стоит quantity * price. Вот позиции заказов 5 и 6:
SELECT order_id, game_id, quantity, price,
quantity * price AS item_total
FROM order_items
WHERE order_id IN (5, 6);| order_id | game_id | quantity | price | item_total |
|---|---|---|---|---|
| 5 | 4 | 1 | 30 | 30 |
| 5 | 20 | 1 | 35 | 35 |
| 6 | 2 | 2 | 15 | 30 |
А так складываются их значения item_total:
SELECT SUM(quantity * price) AS total
FROM order_items
WHERE order_id IN (5, 6);| total |
|---|
| 95 |
Сумма по всей таблице order_items — это стоимость всего, что заказали клиенты. Это не совсем то, что заработал магазин: сюда входят позиции двух возвращённых заказов, за которые клиентам вернули деньги. Был ли заказ возвращён, записано в другой таблице, orders, а как объединять таблицы, вы узнаете в уроке о соединениях. До тех пор суммы в этом уроке включают возвращённые заказы, кроме последнего упражнения, где вы исключите их другим способом.
Как и COUNT(column), SUM и AVG пропускают NULL, поэтому AVG делит на количество значений, а не строк. А когда складывать нечего, потому что WHERE не нашёл ни одной строки, они возвращают NULL, а не 0. Если там нужен 0, используйте COALESCE(SUM(price), 0) из урока о функциях.
Типичная ошибка: SUM(price) вместо SUM(quantity * price). В заказе 6 клиент купил два экземпляра Pixel Racer, а SUM(price) посчитала бы только один из них.
Задание
- 1
Сколько экземпляров игр заказали клиенты? Сложите столбец
quantityтаблицыorder_itemsв столбцеcopies_ordered:copies_ordered 45 - 2
Ниже вычислите стоимость всех заказанных позиций: сумму
quantity * priceв столбцеitems_value:items_value 1260 - 3
А ещё покажите среднюю цену игр для всех возрастов (
age_ratingравен 3), округлённую до 2 знаков после запятой, в столбцеaverage_price:average_price 25.71