#mysql #sql
Вопрос:
У меня таблица выглядит так, как показано ниже:
Таблица истории хранения
Инвентарный номер | Инвентаризация | Инвентаризация |
---|---|---|
1 | 2014-06-01 | 20 |
2 | 2014-06-15 | 45 |
3 | 2014-07-01 | 31 |
4 | 2014-07-15 | 24 |
5 | 2014-08-01 | 54 |
6 | 2014-08-15 | 76 |
7 | 2014-09-01 | 91 |
8 | 2014-09-15 | 24 |
9 | 2015-06-01 | 56 |
10 | 2015-06-15 | 82 |
Я хочу получить сумму запасов за разные месяцы и годы
— первый след
SELECT InventoryAmount,
YEAR(InventoryDate) AS Year,
MONTH(InventoryDate) AS Month
FROM storeHistory
GROUP BY Year AND Month
HAVING COUNT (InventoryAmount);
Это приводит к следующей ошибке:
Код ошибки: 1055.Выражение № 1 списка ВЫБОРА не входит в предложение GROUP BY и содержит неагрегированную историю хранения столбцов.Инвентаризация, которая функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode=only_full_group_by…«
—второй след
SELECT COUNT(InventoryAmount) as Amount
FROM storeHistory
GROUP BY DATE_FORMAT(InventoryDate, '%Y-%m-%d ');
Однако это тоже не работает.
Комментарии:
1. именно то, что сказала ошибка, это то, что изменилось в какой — то версии MySQL-вы можете либо изменить свой запрос, либо настройки MySQL
Ответ №1:
Я предлагаю использовать эту версию, руководствуясь вашими текущими двумя запросами, которые почти верны:
SELECT DATE_FORMAT(InventoryDate, '%Y-%m') ym, SUM(InventoryAmount) AS Amount
FROM storeHistory
GROUP BY ym;
Обе ваши попытки имеют различные проблемы. Эмпирическое правило для GROUP BY
запросов состоит в том, что каждый столбец , появляющийся в SELECT
предложении, должен быть либо агрегированным, таким как SUM()
, либо также должен отображаться GROUP BY
.
Ответ №2:
Ваш запрос на самом деле содержит несколько ошибок:
- Столбцы в
GROUP BY
разделяются запятой, нетAND
. - Вам нужно объединить (например
SUM
) все столбцы, которые вы не группируете. - Ваше
HAVING
предложение не имеет смысла. Поэтому я убрал его.HAVING
этоWHERE
предложение для групп.
SELECT SUM(InventoryAmount)
YEAR(InventoryDate) AS Year,
MONTH(InventoryDate) AS Month
FROM storeHistory
GROUP BY Year, Month;