2011-12-18 34 views
1

這一個是非常棘手的,我一直在撓我的頭一整天。MySQL按比例計算不同的值在上個期間

我有一個包含一個表計費週期

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天到賬單的一個完整週期

+0

你確定你的訂閱不通過'1'偏移?你除以'30',這意味着'1'和'30'都包含在內,但客戶'4'在'28','29'和'30'上有效,這使得'3'天,而不是'2' '。 – Quassnoi 2011-12-18 15:25:06

+0

我相信你是對的我會用正確的偏移量更新它 – Akshat 2011-12-18 15:52:46

回答

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 2011-12-18 15:31:50