2011-12-18 6 views
1

これは非常に難しいことですが、私は一日中頭を掻いています。最後の期間に別の値を計算するMySQLプロラスター

私は「サブ顧客の

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

を含むテーブルを持っている

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

請求期間を含むテーブルを持っている私は、サブスクリプションで購入したアイテムを含むテーブル(卸売アカウント

を持っています
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 

私は彼らのアカウントから控除するために「クレジット」を数えたいので、サブスリ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 

出力は、したがって、私は以前に彼らが前に請求日にアイテム1日を購入しても、全期間を請求する不公平だろう、按分それをカウントする必要があり

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

する必要があります

+0

あなたは必ずあなたのサブスクリプションが '1'によって相殺されていませんか? '1'と' 30 'の両方を含む '30'で割りますが、' 28'、 '29'と' 30'で顧客 '4'がアクティブだった場合、' 2'ではなく '3'日になります'。 – 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'に' date'を集計しません。 'DATEDIFF'は、任意の購入とサブ顧客の任意の請求の差を返します。 – Quassnoi

関連する問題