1

我有一个列 ID、Start_date、End_date、Duration、Value 的成员资格表

ID | Start_date | End_date | Duration | Value |
1  | 2012-08-12 |2012-09-12|    30    |   10  |
2  | 2011-05-22 |2013-05-22|   720    |  2000 |

等等

我想把它变成两列,一个有日期,一年中的每一天,另一个有当天所有会员价值/持续时间的总和。

我最终需要将其转换为每月价值,让我清楚地了解未来的收入预期,这要归功于运行会员资格。

现在我做了类似的事情

select 
sum(if("2012-01-01" between start_date and end_date, total_value/duration, null)) as "2012-01-01",
sum(if("2012-01-02" between start_date and end_date, total_value/duration, null)) as "2012-01-02",
[...]
sum(if("2013-12-31" between start_date and end_date, total_value/duration, null)) as "2013-12-31"

from MembershipsTable

/* 0 行受影响,1 行找到。1 个查询的持续时间:3,666 秒。*/

但我不明白如何轻松地将它们总结为每月的价值。我可以再次创建列的总和,但宁愿不必输入文字小说

运行时间不是当前格式的问题

我需要形状的输出

Month    | Sum    |
Jan 2012 |4500    |
Feb 2012 |4215,91 |

其中,总和是与该期间相交的所有会员的总和,按每天的价格 * 会员在该月拥有的天数计算。

因此,如果会员资格于 11 月 12 日开始,12 月 11 日结束,持续时间为 30,价值为 300,我想将 300/30*daysInNov 添加到 11 月,同样适用于 12 月,给我 +190 的 11 月,+110 的十二月我需要以这种方式计算所有成员的总和。

有人有什么主意吗?

4

1 回答 1

2

这有点丑陋,但如果我正确理解您的需求,我相信类似下面的内容会起作用。

首先,创建一个名为 month_days 的表格,其中包含所有月份及其开始和结束日期。您可以将其用作实用程序表来加入和计算每月总计。

month_days
start_date | last_date 
2012-01-01 | 2012-01-31
2012-02-01 | 2012-02-29

然后,执行如下连接和计算:

select format(month_days.start_date, 'MMM yyyy') AS [Month],
       sum(case when (memberships.start_date > month_days.start_date AND memberships.end_date < month_days.end_date)
              then datediff(day, memberships.end_date, memberships.start_date) * (value/duration)
            when (memberships.start_date between month_days.start_date and month_days.end_date)
              then (datediff(day, month_days.end_date, memberships.start_date) + 1) * (value/duration)
            when (memberships.end_date between month_days.start_date and month_days.end_date)
              then datediff(day, memberships.end_date, month_days.start_date) * (value/duration)
            else (datediff(day, month_days.end_date, month_days.start_date) + 1) * (value/duration)
        end) total_value
from memberships
inner join month_days
on memberships.start_date < month_days.end_date
and memberships.end_date > month_days.start_date
group by month_days.start_date
order by month_days.start_date

有许多方法可以创建可以达到类似效果的 month_days 表。

您可能还可以编写一个存储过程来遍历每条记录的月份,用每月总和填充临时表(或表变量),然后返回临时表的内容。

于 2012-12-04T16:53:51.807 回答