MySQL按比例统计上一期的不同值

标签 mysql count sum distinct

这个非常棘手,我整天都在摸不着头脑。

我有一个包含计费周期的表格

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/

相关文章:

MySQL:使用列表中的随机数更新所有行

MySQL - 函数中从 'yyyy-mm-mm' 到 'yyyy-mm' 的日期格式

python - 返回字典 Python 中所有值的总和

php - 动态获取列中每个唯一值的计数

postgresql - 通常简单的 SQL 连接

sql - 累计计数

mysql - jboss 6.2 EAP 无法添加 mysql 数据源和模块

php - 如何在特定用户登录时显示工厂

php - 将日期对象分组为天

mysql - 如何优化表以选择 SUM?