2012-05-10 64 views
1

名單我有一個表T-SQL:日期不使用臨時表

|起始日期|結束日期|值|值顯示的平均每日|

| 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遞歸視圖的是臨時表

我不擔心在視圖中的表現類似,CAZ認爲以後會參與其他過程。

我會嘗試遞歸視圖然後,如果它不適合,我可能只使用硬代碼日期列表表

+0

看起來像一個剛剛問過的問題:http:// stackoverflow。com/questions/10532462/create-a-select-statement-with-group-by/10532543#10532543 – amaters

回答

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日

+0

謝謝你,請參閱我編輯的問題。你對性能問題的建議是什麼?是遞歸還是好的? –

+0

遞歸只是爲了得到'你感興趣的範圍內的所有日期'。它不會遞歸你的表。您可以更新alldates查詢以將日期限制爲表格中的最小值和最大值,但我不認爲它是一個問題。 –

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)<[email protected] 
) 
select * from months OPTION (MAXRECURSION 0); 

enter image description here

etc..etc..etc ..

+0

這是一個怎樣的視圖,它所做的只是產生一組日期? –

+0

@PreetSangha我寫了無tmp表創建日期的解決方案。 '沒有使用臨時表來生成日期列表是可能的''。你沒有更新 - 你的答案中有任何東西。 (excpet添加到視圖) –

+0

謝謝你,請參閱我編輯的問題。你對性能問題的建議是什麼?是遞歸還是好的? –