問題
から複数の行を選択:私は列を持つテーブルでプロジェクトを保存し、私のSQLサーバー・2014年にタイムスパン
開始日 .. | 終了日 .... | プロジェクト名 ................. | ボリューム
2017-02-13 | 2017-04-12 | GenerateRevenue ......... | 20.02
2017-04-02 | 2018-01-01 | BuildRevenueGenerator | 300.044
2017-05-23 | | 2018-03-19 | Harvest Revenue ............ | 434.009
プロジェクトごとに1か月に1つの行を私に与えるにはSELECTが必要です。月の日を考慮する必要はありません。
日付 .......... | プロジェクト名 .................. | ボリューム
2017-02-01 | GenerateRevenue ......... | 20.02
2017-03-01 | GenerateRevenue ......... | 20.02
2017-04-01 | GenerateRevenue ......... | 20.02
2017-04-01 | BuildRevenueGenerator | 300.044
2017-05-01 | BuildRevenueGenerator | 300.044
2017-06-01 | BuildRevenueGenerator | 300.044
...
理想的にはSELECTのロジックは私の両方が、毎月のボリュームと、各月と以前との違いを計算することができます。
日付 .......... | プロジェクト名 .................. | VolumeMonthly
2017-02-01 | GenerateRevenue ......... | 6.6733
2017-03-01 | GenerateRevenue ......... | 6.6733
2017-04-01 | GenerateRevenue ......... | 6.6733
2017-04-01 | BuildRevenueGenerator | 30.0044
2017-05-01 | BuildRevenueGenerator | 30.0044
2017-06-01 | BuildRevenueGenerator | 30.0044
...また
...
は、私は、一時的なカレンダーのテーブルの上にマッピングすることができます知っているが、それは非常に高速肥大化と複雑になる傾向にあります。私は本当にこの問題を解決する良い方法を探しています。
ソリューション
ゴードンズソリューションは非常にうまく働いていたし、それはある種のカレンダー上の第二のテーブルまたはマッピングを必要としません。私は組合の両側が同じSELECTを持つように、いくつかの変更が必要でしたが。
ここに私の適応バージョン:
with cte as (
select startdate as mondate, enddate, projectName, volume
from projects
union all
select dateadd(month, 1, mondate), enddate, projectName, volume
from cte
where eomonth(dateadd(month, 1, mondate)) <= eomonth(enddate)
)
select * from cte;
ボリュームは毎月でボリュームを交換することによって達成することができます。
CAST(Cast(volume AS DECIMAL)/Cast(Datediff(month,
startdate,enddate)+ 1 AS DECIMAL) AS DECIMAL(15, 2))
END AS [volumeMonthly]
私は赤ん坊のステップをお勧めします。 –
サンプルデータと望ましい結果が役立ちます。あなたはまた、質問を簡素化する必要があります。 –
ありがとうゴードン、そうです。私はあなたのようにいくつかのサンプルデータを追加しました。 – LeComte