Пытаюсь написать запрос, чтобы получить общее количество продаж за месяц.
Итак, в настоящее время я могу написать этот запрос, чтобы вернуть месяц и год:
SELECT
DISTINCT(MONTHNAME(STR_TO_DATE(`date`, '%m/%d/%Y'))) AS 'Month'
,YEAR(STR_TO_DATE(`date`, '%m/%d/%Y')) AS 'Year'
,`total`
FROM `supermarket_sales`
И я могу вернуть следующее:
Итак, сейчас я хочу получить общую сумму за каждый месяц.
Используя ответ, найденный здесь: Общий объем продаж в месяц
И это моя попытка имитировать принятый ответ по ссылке выше:
SELECT
DISTINCT(MONTHNAME(STR_TO_DATE(`date`, '%m/%d/%Y'))) AS 'Month',
YEAR(STR_TO_DATE(`date`, '%m/%d/%Y')) AS 'Year',
SUM(`total`) AS 'TotalSales'
FROM `supermarket_sales`
GROUP BY YEAR(STR_TO_DATE(`date`, '%m/%d/%Y')), MONTH(STR_TO_DATE(`date`, '%m/%d/%Y'))
ORDER BY YEAR(STR_TO_DATE(`date`, '%m/%d/%Y')), MONTH(STR_TO_DATE(`date`, '%m/%d/%Y'))
Но я получаю следующую ошибку:
Как я могу заставить это работать?
Функция DISTINCT отсутствует; что ты пытаешься с этим сделать? Это интерпретируется как SELECT DISTINCT ...fieldlist
, но здесь это бесполезно.
Я думаю, вы хотите GROUP BY LAST_DAY(day)
, а затем SELECT LAST_DAY(day), SUM(total)
dev.mysql.com/doc/refman/8.4/en/…
@Charlieface - я хочу получить сумму за весь месяц.
И почему это не сработает? Вы пробовали? Это просто улучшенная версия GROUP BY YEAR(day), MONTH(day)
Другими словами: если вам нужен ответ по другой ссылке, почему бы вам не использовать ее? Ваше существующее решение явно неверно, как отмечали другие. В нем есть ненужный DISTINCT
и по какой-то странной причине используются STR_TO_DATE
и MONTHNAME
.
@Charlieface - Использование LAST_DAY(date
) в моем SELECT возвращает NULL-записи. STR_TO_DATE используется, поскольку данные в date
являются строками и их необходимо преобразовать. MONTHNAME позволил мне получить месяц, и я использовал DISTINCT, чтобы получить отдельные месяцы.
Ну что ж, это ошибка №1: сохранение неправильного типа данных. DISTINCT
— это неправильно, как мы вам постоянно говорим. И я не могу сказать, почему вы получаете такой результат, если не показываете некоторые примеры данных. Пожалуйста, покажите примеры данных (например, операторы CREATE TABLE
и INSERT
).
Если вы используете псевдонимы для столбца в инструкции SELECT, вы можете обратиться к ним позже в запросе.
я попытался создать простую таблицу с форматом даты по умолчанию. У меня это работает нормально.
создание таблицы:
create table supermarket_sales(date date, total float);
вставка значений:
insert into supermarket_sales values
('2019-01-01', 548.971),
('2019-03-01', 80.22),
('2019-03-01', 340.526),
('2019-01-01', 489.048),
('2019-02-01', 634.378),
('2019-03-01', 627.617),
('2019-02-01', 433.692),
('2019-02-01', 772.38),
('2019-01-01', 76.146),
('2019-02-01', 172.746),
('2019-02-01', 60.816);
выбор записей, как вы показали в первом запросе.
select monthname(date) as month, year(date), total as year
from supermarket_sales;
Добавление группы по и упорядочивание по:
select distinct(monthname(date)) as month, year(date) as year, sum(total) as year
from supermarket_sales
group by year,month;
Это то, что сработало для меня. Спасибо за помощь.
Distinct и Group By в одном и том же SQL не имеют смысла. Поскольку вам нужна агрегация Sum() по году и месяцу, используйте Group By и потеряйте Distinct... Вам следует настроить свой код, как здесь:
WITH -- S a m p l e D a t a :
supermarket_sales (DATE_STR, VAL) AS
( Select '01/17/2019', 548.971 Union All
Select '03/15/2019', 80.22 Union All
Select '03/19/2019', 340.526 Union All
Select '01/24/2019', 489.048 Union All
Select '02/21/2019', 634.378 Union All
Select '03/07/2019', 627.617 Union All
Select '02/21/2019', 433.692 Union All
Select '02/21/2019', 772.38 Union All
Select '01/26/2019', 76.146 Union All
Select '02/27/2019', 172.746 Union All
Select '02/28/2019', 60.816
)
-- S Q L :
SELECT MonthName( Str_To_Date( DATE_STR, '%m/%d/%Y' ) ) AS month,
Year( Str_To_Date( DATE_STR, '%m/%d/%Y' ) ) AS year,
Sum(VAL) as total
FROM supermarket_sales
GROUP BY year, month
/*
month year total
---------- ---- -----------
January 2019 1114.165
March 2019 1048.363
February 2019 2074.012 */
См. скрипку здесь.
Я очень ценю вашу помощь, однако ответ от @ChiragPatel был тем, что я искал. Спасибо.
Помните, что
MONTH
возвращает алфавитные символы, которые не будут сортироваться так, как вы ожидаете. Я бы сначала сделалGROUP BY
иORDER BY
в столбце даты, а затем сделал внешний выбор, чтобы отформатировать дату так, как вы хотите.