MySQL: объединение метода MAX с ошибкой предложения GROUP BY 1055 - PullRequest
1 голос
/ 20 октября 2019

У меня есть таблица с ежемесячными продажами продавца автомобилей, который продает 3 разных бренда. Я хочу создать запрос, который возвращает таблицу года, месяца и марки наиболее продаваемого автомобиля с суммой, проданной за этот месяц.

Часть таблицы ниже:

+-----+--------+-----------+-------------+
|NYEAR| NMONTH | CAR_BRAND | AMOUNT_SOLD |
+-----+--------+-----------+-------------+
|2018    12     HONDA            15      |
|2018    12     TOYOTA           12      |
|2018    12     FORD             22      |
|2019     1     HONDA            14      |
|2019     1     TOYOTA           13      |
|2019     1     FORD             34      |
|2019     2     TOYOTA           10      |
|2019     2     FORD             19      |
|2019     2     HONDA            13      |
|2019     3     FORD             14      |
|2019     3     OYOTA            13      |
|2019     3     HONDA            15      |
|2019     4     HONDA            12      |
|2019     4     TOYOTA           14      |
|2019     4     FORD             11      |
|2019     5     FORD             11      |
|2019     5     HONDA            13      |
|2019     5     TOYOTA           10      |
+-----+--------+-----------+-------------+

Я могу получить максимальный ответ AMOUNT_SOLD в месяц, но не могу получить название магазина. Вот запрос, который я пробовал.

SELECT NYEAR, NMONTH, MAX(SALES_AMOUNT)
FROM MONTHLY_CAR_SALES
GROUP BY NYEAR, NMONTH;

Однако, когда я пытался добавить CAR_BRAND в выбор запроса:

SELECT NYEAR, NMONTH, CAR_BRAND, MAX(SALES_AMOUNT)
FROM MONTHLY_CAR_SALES
GROUP BY NYEAR, NMONTH;

Я получаю:

Код ошибки: 1055. Выражение № 3 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец «USED_CAR_SALES.MONTHLY_CAR_SALES.CAR_BRAND», который функционально не зависит от столбцов в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by

Когда я пытаюсь добавить CAR_BRAND в предложение группировки, он возвращает ту же таблицу, что и выше, которая показывает каждый бренд за каждый месяц.

Стол, за которым я следую, выглядит так:

+-----+--------+-----------+-------------+
|NYEAR| NMONTH | CAR_BRAND | AMOUNT_SOLD |
+-----+--------+-----------+-------------+
|2018    12     FORD             22      |
|2019     1     FORD             34      |
|2019     2     FORD             19      |
|2019     3     HONDA            15      |
|2019     4     TOYOTA           14      |
|2019     5     HONDA            13      |
+-----+--------+-----------+-------------+

1 Ответ

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

Вы хотите получать самые продаваемые записи в месяц.

Существует несколько возможных подходов (в частности, not exists и оконная функция row_number()), но использование коррелированного подзапроса обычно предлагает лучшийпроизводительность (и, на мой взгляд, читабельность):

select nyear, nmonth, car_brand, sales_amount
from monthly_car_sales cs
where sales_amount = (
    select max(sales_amount) 
    from monthly_car_sales cs1 
    where cs1.nyear = cs.nyear and cs1.nmonth = cs.nmonth
)

Для производительности рассмотрите индекс по (nyear, nmonth, sales_amount).

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