如何从mysql中包含日期数据的表中估算每个月的列值?

时间:2014-10-05 23:39:54

标签: python mysql sql

我在mysql中有一个mysql表'data_table',大约有500万条记录,如:

  ------------------------------------------------------------------
    serial  |   month from  |   month to         |       consumption

    123         2012-01-01     2013-01-10                  200
    111         2012-12-28     2013-01-29                  324
    123         2013-01-11     2013-05-13                  1675
    111         2013-01-30     2013-02-16                  200
    391         2012-12-28     2013-02-27                  113
    123         2013-05-14     2013-05-28                  234
    123         2013-05-29     2013-06-05                  53
    123         2013-08-01     2013-09-26                  783 
  -------------------------------------------------------------------

如何找到每个月的消费估算值,如: 1月份的消费量(2013-01-01至2013-01-31)= ...,2月份的消费量= ....

结果应该是:2013年1月的估计值

Serial     Month        year     Estimated_Consumption
 123       January      2013              472.5

像这样,代码应该能够列出所有月份,年份和相应序列号的估计值。

序列123的1月估计背后的逻辑是:

Total number of days in January = 31, 
Consumption for the first 10 days = 200
Consumption for the next 21 days = number of days for January in (2013-01-11, 2013-05-13)
* consumption per day for the period (2013-01-11, 2013-05-13)
Adding both these I get the consumption for January =  472.5

1 个答案:

答案 0 :(得分:0)

首先,谢谢大家的回复。我想出了如何做到这一点。 为此,我使用了一个日历表,如以下链接中所述:http://www.brianshowalter.com/calendar_tables

此外,我在数据表中添加了另一列,即每日消费表。 例如:

    premise         date_from       date_to     consumption     consumption per day
    111             12/13/2012      1/22/2013       200         4.88
    222             12/17/2012      1/12/2013       300         11.11
    111             1/23/2013       4/20/2013       200         2.27
    222             1/13/2013       1/20/2013       300         37.5
    111             4/23/2013       5/10/2013       200         11.11

查询是:

SELECT id,
        date_from as bill_start_date,
        theYear as Year,
        MONTHNAME(STR_TO_DATE(theMonth, '%m')) as month,  # use theMonth for displaying the month as a number
        DaysOnBill,
        TotalDaysInTheMonth,
        sum(perDayConsumption *  DaysOnBill) as EstimatedConsumption 
    FROM
    ( 
     SELECT
        id,
        date_from,
        theYear,
        theMonth,  # use theMonth for displaying the month as a number
        COUNT(*) AS DaysOnBill,
        TotalDaysInTheMonth, 
        perDayConsumption
    FROM
        (
        SELECT
            c.id,
            c.date_from as date_from,
            ct.dt,
            y AS theYear,
            month AS theMonth,
            DAY(LAST_DAY(ct.dt)) as TotalDaysInTheMonth,
            perDayConsumption
        FROM
            consumption AS c
            INNER JOIN
            calendar_table AS ct
                ON ct.dt >= c.date_from
                    AND ct.dt<= c.date_to
        ) AS allDates
    GROUP BY
        id,
        date_from,
        theYear,
        theMonth ) AS estimates
GROUP BY
        id,
        theYear,
        theMonth;

这里的日历表是​​一个单独的表,其中列出了月,年和日期等。