Добрый день!
У меня есть таблица, в которой указаны даты продаж билетов и суммы, например: за 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`