Подсчет оплаты от диапазона дат в MySQL - PullRequest
2 голосов
/ 03 апреля 2012

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

Вот пример данных из моей таблицы

id    starts_from     payment_per_day
=======================================
1     2012-01-01      10,000.00
2     2012-01-15      10,500.00
3     2012-02-01      11,000.00
4     2012-02-15      11,500.00
5     2012-03-01      12,000.00

Какмне рассчитывать общий платеж с 2012-01-21 по 2012-02-20?

Общая сумма платежа должна составлять 338 500

from 2012-01-21 to 2012-01-31 = 11 days * 10,500
from 2012-02-01 to 2012-02-14 = 14 days * 11,000
from 2012-02-15 to 2012-02-20 =  6 days * 11,500

Но если я сделаю:

SELECT SUM(payment_per_day) as total FROM table 
WHERE starts_from BETWEEN '2012-01-21' AND '2012-02-20'

результат - всего 22 500

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 03 апреля 2012
SELECT SUM(payment_per_day) as total FROM table 
WHERE starts_from BETWEEN '2012-01-21' AND '2012-02-20';
2 голосов
/ 04 апреля 2012

Я бы сначала расширил диапазон в список дат, а затем использовал бы следующий запрос:

SELECT SUM(p1.payment_per_day)
FROM dates d
  INNER JOIN payments p1 ON p1.starts_from <= d.date
  LEFT  JOIN payments p2 ON p2.starts_from <= d.date
                        AND p2.starts_from > p1.starts_from
WHERE p2.id IS NULL

Вы можете получить список из диапазона с помощью таблицы чисел, например:

SELECT DATE_ADD(@date_from, INTERVAL num DAY)
FROM numbers
WHERE num BETWEEN 0 AND DATEDIFF(@date_to, @date_from)

Таблица чисел - вещь, которую стоит иметь, поскольку она может быть полезна во многих ситуациях, поэтому подумайте над тем, чтобы предоставить ее себе. Вот очень простой скрипт для создания и инициализации таблицы чисел:

CREATE TABLE numbers AS SELECT 0 AS num;
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers;
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers;
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers;
… /* repeat as necessary, each line doubles the number of rows in the table */

Но, конечно, вместо этого вы можете использовать цикл.

Вот моя полная среда тестирования на SQL Fiddle (для любого, с кем можно поиграть).

0 голосов
/ 04 апреля 2012

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

Так что я работаю, выбирая данные из всех дат start_from до <= 2012-02-20и затем выбираем последний старт_с даты, которая меньше 2012-01-21 (то есть 2012-01-15), чтобы получить payment_per_day 10 500,00 </p>

Спасибо за просмотр моего вопроса:)

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