2012-03-01 77 views
5

我有一個存儲過程,用於在日期中提取數據並加入去年的數據。問題是今年的數據沒有什麼可參考的,因爲2011年2月29日沒有。有沒有其他人遇到過這個問題?任何人有任何想法如何解決它?2月29日與前一年的2月28日比較

這裏是存儲過程:

SELECT 
--b.Date_Rep AS Date_Rep, 
SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot, 
SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot, 

FROM Report2011.dbo.T_Report_01 b WITH (NOLOCK) --This year  
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) ON DATEADD(yyyy,-1,b.Date_Rep) = a.date_rep --Last year 
WHERE (a.Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate)) 
+0

爲什麼'LEFT JOIN'當'WHERE'條款會迫使它成爲一個內部聯接? 'DATEADD'不能創建無效的日期,所以它*是*加入的問題,但是到了「錯誤的」日期或什麼? – 2012-03-01 14:23:40

+0

難道這不就是去年3月1日的比較嗎? – Greg 2012-03-01 14:25:06

+1

@ J.B。我與J銅 - 你已經比較了今年28日至去年28日,所以沒有日期可以比較今年29日至今年的數據。 – Filburt 2012-03-01 14:27:39

回答

0
declare @29Feb datetime = convert(datetime,'2012/02/29') 
    declare @28Feb datetime = convert(datetime,'2012/02/28') 

select case when 
      dateadd(yy,-1,@29Feb) = dateadd(yy,-1,@28Feb) 
      then 1 
      else 0 end 

這個SELECT語句輸出1,所以實際上在02月29日和2月28日只有一個在過去一年中對應的日期02月28

現在您正在爲不同年份的兩個期間進行結算,因此第一個期間比當前期間少了1天。
怎麼會有人回答以下問題:

"How many accounts have been created in the last year's February and how many this year?" 

不要緊,事實上一個有二月28天,其餘29個?我不這樣認爲,參考是2月份,而不是日期。

所以我看到兩個問題與此查詢:

  • 有可能是今年在沒有賬戶已經創建了一天,但在過去的一年裏,在同一時期,一些帳戶一樣,所以左加入並沒有趕上去年的
  • 今年對於今年的兩個不同的日子,28日和29日只對應一天,28日,所以這一次總結了兩次。


SELECT  (SUM(b.AccountsCreatedThisYear) 
    FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) --This year 
    WHERE Date_Rep BETWEEN @StartDate and @EndDate) as AccountsCreatedThisYearTot, 

    (SUM(b.AccountsCreatedThisYear) 
    FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) -- Last Year 
    WHERE Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate)) as AccountsCreatedLastYearTot 
1

嘗試使用的FULL OUTER JOIN而不是LEFT JOIN和使用COALESCE

SUM(COALESCE(b.AccountsCreatedThisYear, 0)) AS AccountsCreatedThisYearTotSUM(COALESCE(a.AccountsCreatedThisYear, 0)) AS AccountsCreatedLastYearTot

使你避免空的時,日期不匹配。

4

對於初學者,我不會對左連接外側的表的列做where子句。試試這個,而是:

SELECT SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot, 
     SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot, 
FROM Report2011.dbo.T_Report_01 b WITH (NOLOCK) --This year  
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) 
     ON DATEADD(yyyy,-1,b.Date_Rep) = a.date_rep --Last year 
WHERE b.Date_Rep BETWEEN @StartDate AND @EndDate 
+1

是的,他將左連接轉換爲內連接。 – HLGEM 2012-03-01 14:34:05

0

有沒有2月29日去年,但3月1日爲365天前 - 2月份28366天前。

SELECT SUM(b.AccountsCreatedThisYear) AS AccountsCreatedThisYearTot, 
    SUM(a.AccountsCreatedThisYear) AS AccountsCreatedLastYearTot, 
FROM Report2011.dbo.T_Report_01 b WITH (NOLOCK) --This year  
LEFT JOIN Report2011.dbo.T_Report_01 a WITH (NOLOCK) 
    ON DATEADD(dd,-365,b.Date_Rep) = a.date_rep --Last year 
WHERE b.Date_Rep BETWEEN @StartDate AND @EndDate 

+1馬克·班尼斯特,我用自己的語法

相關問題