2011-12-18 6 views
1

Это довольно сложно, я весь день царапаю голову.MySQL pro rata подсчет различных значений за последний период

У меня есть таблица, содержащая биллинговые периоды

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 

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

Итак, в конце расчетного периода (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 день до даты выставления счетов

+0

вы уверены, что ваши подписки не компенсируются '1'? Вы делите на '30', что означает, что« 1 »и« 30 »включены, но клиент' 4' был активным на '28',' 29' и '30', это делает' 3' дней, а не '2 '. – Quassnoi

+0

Я считаю, что вы правы. Я обновлю его с правильным смещением. – Akshat

ответ

0
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 
0
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

. Вы не группируете период выставления счетов во внутреннем запросе и не суммируете «дату» в 'DATEDIFF'. 'DATEDIFF' вернет разницу между произвольной покупкой и произвольным выставлением счетов для субклиента. – Quassnoi

Смежные вопросы