2011-12-18 1 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 

그래서 '크레딧'을 계산하여 계정에서 공제하고 싶습니다. 따라서 구독자 구매는 '하위 고객'당입니다.

따라서 청구 기간이 끝날 때 (첫 번째 표에서 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 

을해야한다

+0

당신은 반드시 구독은'1'에 의해 상쇄되지 않습니다 있습니까? '1'과 '30'둘 다 포함되지만 '28 ','29 ','30 '에서 고객'4 '가 활성화 된 경우'30 '으로 나누면'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