Когда я помещаю несколько переменных в раздел «ВЫБОР», группа ПО разделам не работает

#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;