MySQL пропорциональный подсчет различных значений за последний период - PullRequest
1 голос
/ 18 декабря 2011

Это довольно сложно, я весь день ломал голову.

У меня есть таблица с периодами выставления счетов

ID     | DATEBEGIN | DATEEND  | CUSTOMER_ID
=======+===========+==========+=================
1      | 1/1/2011  | 30/1/2011 | 1

У меня есть таблица, содержащая «суб-клиентов»

ID     | NAME    
=======+===========
1      | JOHN
2      | JACK
3      | Elwood

У меня есть таблица, содержащая товары, приобретенные по подписке (оптовая учетная запись

ID     | DATE      | SUBCUSTOMER_ID | CUSTOMER ID
=======+===========+================+==============
1      | 15/1/2011 | 1              | 1
2      | 18/1/2011 | 1              | 1
3      | 25/1/2011 | 2              | 1
4      | 28/1/2011 | 3              | 1

. Поэтому я хочу считать «кредиты» для вычета из их учетной записи. Таким образом, подписка насуб-клиент '.

Таким образом, в конце расчетного периода (30/1/2011 из первой таблицы). Мне нужно подсчитать отдельных суб-клиентов (их 3). Они взимаются пропорционально отпервая покупка, которую они совершают в течение расчетного периода.

Days Having Subscription  |  SUBCUSTOMER_ID   |  Pro Rata Rate   | CUSTOMER_ID
==========================+===================+==================+==============
3                         |  3                | 3/30             | 1
6                         |  2                | 6/30             | 1
16                        |  1                | 16/30            | 1

Следовательно, результат должен быть

CUSTOMER_ID | BILLING CREDITS
============+========================
1           | 25/30

Я должен считать это пропорционально, ранее было бы несправедливо выставлять счет полностьюпериод, даже если они покупают товар за 1 день до даты выставления счета

Ответы [ 2 ]

0 голосов
/ 18 декабря 2011
SELECT customer_id, sum(pro_rated_date) / max(days_in_billing_cycle)
  FROM (SELECT min(date),
               subcustomer_id,
               datebegin,
               dateend,
               items.customer_id,
               datediff(dateend, datebegin) + 1 AS days_in_billing_cycle,
               datediff(dateend, min(date)) AS pro_rated_date
          FROM    items
               JOIN
                  billing_period
               ON items.date BETWEEN billing_period.datebegin
                                 AND billing_period.dateend
                  AND items.customer_id = billing_period.customer_id
        GROUP BY subcustomer_id) AS billing
GROUP BY customer_id
0 голосов
/ 18 декабря 2011
SELECT  customerId, SUM(DATEDIFF(dateend, fp) + 1) / (DATEDIFF(dateend, datestart) + 1)
FROM    (
        SELECT  b.*, MIN(date) AS fp
        FROM    billing b
        JOIN    purchase p
        ON      p.customerId = b.customerId
                AND p.date >= b.datebegin
                AND p.date < b.dateend + INTERVAL 1 DAY
        GROUP BY
                b.id, p.subcustomerId
        ) q
GROUP BY
        customerId
...