Как получить сумму на каждый день день периода?

Ссылка скопирована
1 ответ

Есть данные по транзакциям: приход-расход. Таблица: ид-дата-сумма-тип (приход/расход). Считаю текущий баланс. Все ок. Задача: нужно построить график баланса за период. Допустим с 1 января по 31 декабря, с разбивкой по дням. Не понимаю как правильно сделать. Делать 365 запросов подсчета баланса на каждый день типа SELECT SUM(приход)-SUM(расход) где дата с 01.01 до 02.01, затем с 01.01 до 03.01 и т д? Или все же SQL умеет такую выборку сам сделать?

Дополнительно:

Может, пора взять хоть какой-нибудь учебник по SQL и почитать? например, про группировку...

  • Akina, пробовал, знаний не хватает
    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 дата в запросе.

  • Евгений, а почему DAY()-то?
  • Укажите ТОЧНО версию СУБД.
  • и еще в учебнике для 2, кажется, класса надо посмотреть что значит знак "больше" >
  • FanatPHP, не оттуда скопировал. Но, суть не меняется, обычная группировка суммирует "по дням" , а не "по дням с начала периода"

    Может мой вопрос не понятен?

    Допустим каждый день приходит 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"

  • Akina, mariadb 10.4
  • Таблица
    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
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Для того чтобы получить сумму на каждый день в течение определенного периода, вам необходимо создать запрос к базе данных, который будет группировать данные по дням и вычислять сумму для каждого дня.

    Предположим, у вас есть таблица в базе данных с полями "дата" и "сумма". Для примера, давайте рассмотрим таблицу с именем "transactions".

    Пример SQL-запроса для получения суммы на каждый день в заданном периоде:

    SELECT DATE(date) as day, SUM(amount) as total
    FROM transactions
    WHERE date BETWEEN 'начальная_дата' AND 'конечная_дата'
    GROUP BY DATE(date)

    SELECT DATE(date) as day, SUM(amount) as total FROM transactions WHERE date BETWEEN 'начальная_дата' AND 'конечная_дата' GROUP BY DATE(date)

    В данном запросе мы выбираем дату и суммируем суммы транзакций для каждого дня в заданном периоде. Замените 'начальная_дата' и 'конечная_дата' на соответствующие значения.

    После выполнения этого запроса, вы получите результат, в котором будут указаны дни и суммы на каждый день в заданном периоде. Эти данные можно использовать для отчетов, анализа и других целей.

    Не забудьте адаптировать этот запрос под вашу базу данных и структуру таблицы. В случае возникновения проблем или дополнительных вопросов, не стесняйтесь задавать их для получения более подробной помощи.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно