Почему я всегда получаю сообщение "предложение и содержит неагрегированный столбец" при выполнении запроса в codeigniter? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь суммировать доход на основе столбца канала и названия продукта, вот запрос, который я использую в Codeigniter:

$datas['row']=$this->db->query('SELECT channel,product_name, SUM(revenue) AS revenue FROM contribution WHERE YEAR(date) = 2019 GROUP BY channel, SUBSTRING(product_name, 1, 3)')->result();

Но в результате всегда возвращается это сообщение: "Выражение #2 из списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец «datamart.contribution.product_name», который не является функционально зависимым от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by "

, но если яизмените запрос следующим образом:

$datas['row']=$this->db->query('SELECT channel,product_name, SUM(revenue) AS revenue FROM contribution WHERE YEAR(date) = 2019 GROUP BY channel, product_name')->result();

он возвращает значение успешно, но не то, что я хочу. Возвращает сумму дохода, которая сгруппирована только по каналу, а не по имени продукта. Я хочу получить сумму дохода в зависимости от канала, а также название продукта.

1 Ответ

1 голос
/ 16 октября 2019

Нельзя выбрать product, если вы агрегируете только по подстроке. Вам нужно одно из:

SELECT channel, MIN(product_name) as product_name, SUM(revenue) AS revenue
FROM contribution
WHERE YEAR(date) = 2019
GROUP BY channel, SUBSTRING(product_name, 1, 3);

Или:

SELECT channel, SUBSTRING(product_name, 1, 3) as product_name_3, SUM(revenue) AS revenue
FROM contribution
WHERE YEAR(date) = 2019
GROUP BY channel, SUBSTRING(product_name, 1, 3);

Неясно, что вы действительно хотите.

Кроме того, я бы посоветовал вам переписать WHERE условие:

WHERE date >= '2019-01-01' AND date < '2020-01-01'

Это упрощает оптимизатору использование индексов и разделов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...