1

私はテーブルを持っています

|開始日|終了日|値|1日あたりの平均値|

|2011-01-01 |2012-01-01| 730 | 2|

このテーブルをView

|日付| 平均値 |

2011-01-01 | 2

2011-01-02 | 2

2011-01-03 | 2

.....

2011-12-31 | 2

一時テーブルを使用せずに日付のリストを生成することは可能ですか? 何か案は?

編集

両方の答えをありがとう

With 再帰ビューは一時テーブルに似ています

ビューが後で他のプロセスに関与するため、ビューのパフォーマンスについて心配しています。

再帰ビューを試してみます。収まらない場合は、ハードコードの日付リスト テーブルを使用するだけです。

4

2 に答える 2

4
declare @start datetime
SET @start = '20110501'
declare @end datetime 
SET @end ='20120501'

;with months (date)
AS
(
    SELECT @start
    UNION ALL
    SELECT DATEADD(day,1,date)
    from months
    where DATEADD(day,1,date)<=@end
)
select * from months OPTION (MAXRECURSION 0); 

ここに画像の説明を入力

など..など..

于 2012-05-10T11:14:38.870 に答える
2

はい、できます。これにより、入力セットから日数が生成され、必要な範囲が得られます

これは技術的には内部的には一時テーブルのようなものですが、再帰的なビューを作成できます:

Create View TestView as
    with Data As -- Pretends to be your table of data replace with  select from your tables
    (
        select Cast('2012-05-01' as DATETIME) [Start Date], Cast('2012-05-02' as DATETIME)  [End Date], 2  [Avgerage Value Per Day]
        union all
        select Cast('2012-04-01' as DATETIME) [Start Date], Cast('2012-04-05' as DATETIME) [End Date], 3  [Avgerage Value Per Day]
    )
    ,AllDates as -- generates all days
    (
         select cast('1900-01-01' as datetime) TheDate
         union all
         select TheDate + 1
         from    AllDates   
         where   TheDate + 1 < '2050-12-31'
    )
    select TheDate [Date], o.[Avgerage Value Per Day]
    from    AllDates
    join Data o on TheDate Between o.[Start Date]   AND   o.[End Date];

クエリを実行できますが、再帰制限を指定する必要があります

select * from TestView
OPTION (MAXRECURSION 0)

これにより、この結果が得られます

Date                        Avgerage Value Per Day
2012-04-01 00:00:00.000 3
2012-04-02 00:00:00.000 3
2012-04-03 00:00:00.000 3
2012-04-04 00:00:00.000 3
2012-04-05 00:00:00.000 3
2012-05-01 00:00:00.000 2
2012-05-02 00:00:00.000 2

5 月 1 ~ 2 日と 4 月 1 ~ 5 日のテスト データから、それがわかります。

于 2012-05-10T11:46:40.420 に答える