Как можно получить общую сумму продаж за один день с помощью SQL?

Добрый день! 

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

Как мне правильно сгруппировать данные и получить требуемый вывод?
  • 2 декабря 2024 г. 11:03
Ответы на вопрос 3
Для того чтобы получить общую сумму продаж за один день и правильно сгруппировать данные по датам, необходимо использовать функцию `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`
Похожие вопросы