Как получить сумму на каждый день день периода?
Есть данные по транзакциям: приход-расход. Таблица: ид-дата-сумма-тип (приход/расход). Считаю текущий баланс. Все ок. Задача: нужно построить график баланса за период. Допустим с 1 января по 31 декабря, с разбивкой по дням. Не понимаю как правильно сделать. Делать 365 запросов подсчета баланса на каждый день типа SELECT SUM(приход)-SUM(расход) где дата с 01.01 до 02.01, затем с 01.01 до 03.01 и т д? Или все же SQL умеет такую выборку сам сделать?
Дополнительно:
Может, пора взять хоть какой-нибудь учебник по SQL и почитать? например, про группировку...
SELECT sum(amount) FROM `money` WHERE datePay > '2022-01-01' and datePay < '2022-03-01' group by DAY(datePay); |
SELECT sum(amount) FROM `money` WHERE datePay > '2022-01-01' and datePay < '2022-03-01' group by DAY(datePay);
Выдает сумму по дням, но не с начала периода
Или все же SQL умеет такую выборку сам сделать?
Конечно умеет. Используйте goup by дата в запросе.
Может мой вопрос не понятен?
Допустим каждый день приходит 2р. И Выборка должна показать
01-01 2 02-01 4 03-01 6 04-01 8 05-01 10 ... 31-01 62 |
01-01 2 02-01 4 03-01 6 04-01 8 05-01 10 ... 31-01 62
с обычным group by date я получу в каждой строке "2"
id data 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 |
id data 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2
выборка по id с 1 по 4 должна показать
1 2 2 4 3 6 4 8 |
1 2 2 4 3 6 4 8
выборка с 3 по 6:
3 6 4 8 5 10 6 12 |
3 6 4 8 5 10 6 12
Все это совершенно неоптимально, так как требуется считать каждый раз с самого начала, но оконные функции решают вашу проблему. Требует MySQL 8 (В MariaDB 10.5 тоже работает, младше не проверял):
CREATE TABLE entries( tran_date TIMESTAMP NOT NULL, amount INT NOT NULL ); INSERT INTO entries VALUES ('2022-01-01 00:01:00', 100), ('2022-01-01 01:01:00', 3400),('2022-01-01 02:01:00', -500), ('2022-01-02 00:01:00', 8000),('2022-01-02 01:01:00', -3900), ('2022-01-02 02:01:00', -900); WITH day_amounts AS ( SELECT DATE(tran_date) AS day, SUM(amount) AS amount FROM entries GROUP BY DATE(tran_date) ) SELECT day, SUM(amount) OVER (ORDER BY day) AS balance FROM day_amounts; |
CREATE TABLE entries( tran_date TIMESTAMP NOT NULL, amount INT NOT NULL ); INSERT INTO entries VALUES ('2022-01-01 00:01:00', 100), ('2022-01-01 01:01:00', 3400),('2022-01-01 02:01:00', -500), ('2022-01-02 00:01:00', 8000),('2022-01-02 01:01:00', -3900), ('2022-01-02 02:01:00', -900); WITH day_amounts AS ( SELECT DATE(tran_date) AS day, SUM(amount) AS amount FROM entries GROUP BY DATE(tran_date) ) SELECT day, SUM(amount) OVER (ORDER BY day) AS balance FROM day_amounts;
https://sqlize.online/sql/mariadb/20805610c3da00c2...
- Работает даже в 10.3
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы получить сумму на каждый день в течение определенного периода, вам необходимо создать запрос к базе данных, который будет группировать данные по дням и вычислять сумму для каждого дня.
Предположим, у вас есть таблица в базе данных с полями "дата" и "сумма". Для примера, давайте рассмотрим таблицу с именем "transactions".
Пример SQL-запроса для получения суммы на каждый день в заданном периоде:
SELECT DATE(date) as day, SUM(amount) as total FROM transactions WHERE date BETWEEN 'начальная_дата' AND 'конечная_дата' GROUP BY DATE(date)
В данном запросе мы выбираем дату и суммируем суммы транзакций для каждого дня в заданном периоде. Замените 'начальная_дата' и 'конечная_дата' на соответствующие значения.
После выполнения этого запроса, вы получите результат, в котором будут указаны дни и суммы на каждый день в заданном периоде. Эти данные можно использовать для отчетов, анализа и других целей.
Не забудьте адаптировать этот запрос под вашу базу данных и структуру таблицы. В случае возникновения проблем или дополнительных вопросов, не стесняйтесь задавать их для получения более подробной помощи.