这个非常棘手,我整天都在摸不着头脑。
我有一个包含计费周期的表格
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
所以我想计算“积分”以从他们的帐户中扣除。所以订阅是按“子客户”进行的。
所以在计费周期结束时(第一个表中的 2011 年 1 月 30 日)。我需要计算不同的子客户(有 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 天购买了商品,也为整个期间开账单是不公平的
最佳答案
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
关于MySQL按比例统计上一期的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8552470/