Добрый день! У меня есть таблица, в которой указаны даты продаж билетов и суммы, например: за 11.06.2020 было продано 20 билетов на общую сумму 4349 р (в 8:00 - 2 билета за 200 р, в 9:00 - 4 билета за 400 р и так далее). Как мне правильно вывести данные в следующем формате: ``` Дата Выручка 11.06.2020 4349 р 12.06.2020 5767 р ``` Я уже пытался сделать запрос, но он выводит все дни с суммами, не группируя данные по датам. Например, вот такой запрос: ```php SELECT payment_date AS date, SUM(amount) OVER (ORDER BY payment_date ASC) AS daily_income FROM payment WHERE MONTH(payment_date) = 7 AND YEAR(payment_date) = 2005 ORDER BY date ``` Этот запрос не решает задачу группировки. Также я пробовал еще один запрос: ```sql SELECT payment_date AS date, SUM(amount) AS daily_income FROM payment WHERE MONTH(payment_date) = 7 AND YEAR(payment_date) = 2005 GROUP BY date ``` Но он тоже не группирует данные должным образом и выводит их в следующем виде: ``` 2005-07-08 03:17:05 5.99 2005-07-08 07:33:56 5.99 2005-07-09 13:24:07 4.99 2005-07-09 16:38:01 4.99 ``` Как мне правильно сгруппировать данные и получить требуемый вывод?
Для того чтобы получить общую сумму продаж за один день и правильно сгруппировать данные по датам, необходимо использовать функцию `GROUP BY`, а также привести дату к нужному формату, игнорируя время. Ваша изначальная проблема возникает из-за того, что вы используете столбец `payment_date` в `GROUP BY`, который содержит дату и время. Необходимо использовать только дату, без времени. Вот пример запроса, который должен работать для вашей задачи: ```sql SELECT DATE(payment_date) AS date, SUM(amount) AS daily_income FROM payment WHERE MONTH(payment_date) = 7 AND YEAR(payment_date) = 2005 GROUP BY DATE(payment_date) ORDER BY DATE(payment_date); ``` В этом запросе используется функция `DATE(payment_date)`, которая извлекает только дату из `payment_date`, чтобы сгруппировать все записи по этим дням. `SUM(amount)` даст общую сумму для каждого дня. Ваш результат будет выглядеть, как вы хотите: ``` Дата Выручка 2005-07-08 11.98 2005-07-09 9.98 ``` Если вам нужно отобразить дату в формате `DD.MM.YYYY`, вы можете использовать функцию `DATE_FORMAT()` (в MySQL) следующим образом: ```sql SELECT DATE_FORMAT(payment_date, '%d.%m.%Y') AS date, SUM(amount) AS daily_income FROM payment WHERE MONTH(payment_date) = 7 AND YEAR(payment_date) = 2005 GROUP BY DATE(payment_date) ORDER BY DATE(payment_date); ``` Этот запрос вернет желаемый формат даты. Вы можете менять фильтрацию `WHERE` на свои нужные условия для получения результатов за другие даты.
В зависимости от диалекта SQL нужно округлить дату до дней или выделить только дату без времени, чтобы правильно сгруппировать сумму.
Например, с помощью trunc так это делается в Oracle:
select trunc(payment_date) as p_date, sum(amount) as daily_income from payment where extract(month from payment_date) = 7 and extract(year from payment_date) = 2005 -- про extract - тоже нужно смотреть, как это принято в конкретном диалекте SQL group by trunc(payment_date) order by p_date desc
SELECT DATE(payment_date) AS `date`, SUM(amount) AS income FROM payment WHERE payment_date >= '2005-07-01' AND payment_date < '2005-08-01' GROUP BY `date`