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 |

等々

私はそれを2つの列に変えたいと思います。1つはその年の毎日の日付を持ち、もう1つはその日のメンバーシップのすべての価値/期間の合計を持ちます。

最終的には月額に変換する必要があります。これにより、メンバーシップを実行することで、将来どのような収益が期待できるかが明確になります。

今、私は次のようなことをしました

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秒。* /

しかし、それらを簡単に合計して1か月あたりの値を算出する方法がわかりません。列の合計をもう一度作成することもできますが、テキストの小説を入力する必要はありません。

実行時間は現在の形式では問題ではありません

形状の出力が必要です

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

ここで、合計は、その期間と交差するすべてのメンバーシップの合計であり、1日あたりの価格*メンバーシップがその月に持つ日数によって計算されます。

したがって、メンバーシップが11月12日に開始し、12月11日に終了し、期間が30で、値が300の場合、11月に300/30 * daysInNovを追加します。これは、12月と同じで、11月に+190、 12月私はそのようにすべてのメンバーシップの合計が必要です。

誰かが何か考えを持っていますか?

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 に答える