2014-03-26 126 views
0

我試圖使用聯接兩個表下面的SQL Server查詢返回的預測接口.NET數據表:右外連接未返回預期行?

SELECT accounts.AccountID 
,accounts.Account 
,SUM(CASE 
     WHEN forecast.omonth = 1 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Jan 
,SUM(CASE 
     WHEN forecast.omonth = 2 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Feb 
,SUM(CASE 
     WHEN forecast.omonth = 3 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Mar 
,SUM(CASE 
     WHEN forecast.omonth = 4 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Apr 
,SUM(CASE 
     WHEN forecast.omonth = 5 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 May 
,SUM(CASE 
     WHEN forecast.omonth = 6 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Jun 
,SUM(CASE 
     WHEN forecast.omonth = 7 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Jul 
,SUM(CASE 
     WHEN forecast.omonth = 8 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Aug 
,SUM(CASE 
     WHEN forecast.omonth = 9 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Sep 
,SUM(CASE 
     WHEN forecast.omonth = 10 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Oct 
,SUM(CASE 
     WHEN forecast.omonth = 11 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Nov 
,SUM(CASE 
     WHEN forecast.omonth = 12 
      THEN forecast.ns1 
     ELSE 0 
     END)/1 Dec 
FROM accountForecast forecast 
RIGHT OUTER JOIN account_tree accounts ON forecast.AccountID = accounts.AccountID 
WHERE forecast.oYear = 2014 
AND accounts.AccountID in (35, 36, 37, 38, 39, 40, 41, 78, 79, 80, 81, 1, 82, 176) 
GROUP BY accounts.AccountID 
    ,accounts.Account 

的accountForecast表的結構如下: enter image description here

該查詢應即使給定帳戶在accountForecast表中沒有條目,也會爲WHERE子句(35,36,37等)中的所有帳戶ID返回一行,在這種情況下查詢應該返回0。

我的查詢當前只返回一行,其中包含已插入accountForecast表中的AccountID。我連接不正確?我應該改變什麼?

編輯:我刪除了forecast.oYear = 2014 WHERE子句,它似乎按預期工作。但是,重要的是這個查詢需要輸入年份參數,因爲數據取決於它。有沒有辦法在指定年份的時候返回所有的賬戶行?

+0

是怎麼account_tree表設置?還有,哪個版本的sql? –

回答

2

您的篩選排除了NULL值:

WHERE forecast.oYear = 2014 
1

這是很難理解您的實際存儲數據,但我假設所有的賬戶都保存在account_tree?如果是這樣,嘗試扭轉FROMJOIN條款:

FROM account_tree accounts 
RIGHT OUTER JOIN accountForecast forecast ON forecast.AccountID = accounts.AccountID 
WHERE forecast.oYear = 2014 
AND accounts.AccountID in (35, 36, 37, 38, 39, 40, 41, 78, 79, 80, 81, 1, 82, 176) 
GROUP BY accounts.AccountID 
    ,accounts.Account