Получить сумму продаж за месяц

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

Итак, в настоящее время я могу написать этот запрос, чтобы вернуть месяц и год:

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'))

Но я получаю следующую ошибку:

Как я могу заставить это работать?

Помните, что MONTH возвращает алфавитные символы, которые не будут сортироваться так, как вы ожидаете. Я бы сначала сделал GROUP BY и ORDER BY в столбце даты, а затем сделал внешний выбор, чтобы отформатировать дату так, как вы хотите.

Tim Roberts 14.07.2024 04:04

Функция DISTINCT отсутствует; что ты пытаешься с этим сделать? Это интерпретируется как SELECT DISTINCT ...fieldlist, но здесь это бесполезно.

ysth 14.07.2024 04:09

Я думаю, вы хотите GROUP BY LAST_DAY(day), а затем SELECT LAST_DAY(day), SUM(total)dev.mysql.com/doc/refman/8.4/en/…

Charlieface 14.07.2024 04:35

@Charlieface - я хочу получить сумму за весь месяц.

John Beasley 14.07.2024 04:37

И почему это не сработает? Вы пробовали? Это просто улучшенная версия GROUP BY YEAR(day), MONTH(day) Другими словами: если вам нужен ответ по другой ссылке, почему бы вам не использовать ее? Ваше существующее решение явно неверно, как отмечали другие. В нем есть ненужный DISTINCT и по какой-то странной причине используются STR_TO_DATE и MONTHNAME.

Charlieface 14.07.2024 04:39

@Charlieface - Использование LAST_DAY(date) в моем SELECT возвращает NULL-записи. STR_TO_DATE используется, поскольку данные в date являются строками и их необходимо преобразовать. MONTHNAME позволил мне получить месяц, и я использовал DISTINCT, чтобы получить отдельные месяцы.

John Beasley 14.07.2024 04:55

Ну что ж, это ошибка №1: сохранение неправильного типа данных. DISTINCT — это неправильно, как мы вам постоянно говорим. И я не могу сказать, почему вы получаете такой результат, если не показываете некоторые примеры данных. Пожалуйста, покажите примеры данных (например, операторы CREATE TABLE и INSERT).

Charlieface 14.07.2024 05:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
8
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы используете псевдонимы для столбца в инструкции 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;

вывод запроса1

Добавление группы по и упорядочивание по:

select distinct(monthname(date)) as month, year(date) as year, sum(total) as year 
from supermarket_sales
group by year,month;

вывод запроса2

Это то, что сработало для меня. Спасибо за помощь.

John Beasley 14.07.2024 17:00

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 был тем, что я искал. Спасибо.

John Beasley 15.07.2024 01:18

Другие вопросы по теме