2015-12-07 23 views
2

我需要選擇每週報告(每個任務類型每週的收入)。對於某些任務類型沒有條目的幾周,我想將0打印爲收入,但這些組不顯示在我的選擇中。 #weeks是包含我想要報告的所有星期的臨時表。我應該在查詢中修改什麼?如何顯示總和0,哪裏沒有某些值的條目?

SELECT weeks.BeginDate, weeks.EndDate, task.TaskId, task.Abbreviation, task.Name, COALESCE(SUM([entry.Income]), 0) AS IncomePerWeek 
FROM Task task 
LEFT JOIN Entry entry 
ON task.TaskId = entry.TaskId 
INNER JOIN #weeks weeks 
ON entry.EntryDate BETWEEN weeks.BeginDate 
AND weeks.EndDate 
GROUP BY weeks.BeginDate, weeks.EndDate, task.TaskId, task.Abbreviation, task.Name 
ORDER BY weeks.BeginDate, task.Abbreviation 

所以我想結果是這樣的:

BeginDate EndDate TaskId Abbreviation Name IncomePerWeek 
---------------------------------------------------------------------- 
09/11/2015 15/11/2015 1  FT    First 15 
09/11/2015 15/11/2015 2  ST    Second 0 
... 

所以,在2015年9月11日一週 - 15/11/2015有與任務id 2表條目沒有任何條目,但我仍然想要獲得那一週的排名,並且IncomePerWeek = 0。

+4

做另一個LEFT JOIN而不是INNER JOIN? – jarlh

+0

不同之處在於,現在我們每週都會得到一行(至少有一個失蹤的TaskId),如下所示: 09/11/2015 15/11/2015 NULL NULL NULL NULL, 但我希望獲得周的交叉連接以及總和爲0的任務,其中本週和任務沒有任何條目。 – bambi

+0

不知道如果我明白:你想每週看到所有的任務?每個人都有條目的總數,如果沒有條目存在,那麼每個人都是0? –

回答

1

以下工作:

SELECT WT.BeginDate, WT.EndDate, WT.TaskId, WT.Abbreviation, WT.Name, SUM(COALESCE(entries.Income, 0)) AS IncomePerWeek 
    FROM Entry AS entries 
     RIGHT JOIN (
      SELECT weeks.BeginDate, weeks.EndDate, tasks.TaskId, tasks.Abbreviation, tasks.Name 
       FROM Task AS tasks, #weeks AS weeks      
     ) AS WT ON (entries.EntryDate BETWEEN WT.BeginDate AND WT.EndDate) AND WT.TaskId = entries.TaskId 
    GROUP BY WT.BeginDate, WT.EndDate, WT.TaskId, WT.Abbreviation, WT.Name 
    ORDER BY WT.BeginDate, WT.Abbreviation 

的 '要點' 是創造儘可能多的條目作爲 * 任務WT子查詢笛卡爾乘積和 RIGHT JOINentries的基數)。

然後通過COALESCENULL值得出IncomePerWeek值的正確處理條目的不存在。

+0

結果與我的查詢結果相同。 – bambi

+1

@bamby我完全重寫了 – rfb

1

最簡單的解決方案是使用SUM(COALESCE([entry.Income], 0)) AS IncomePerWeek

但是,您的FROM子句對我​​來說是不明確的。你有一個LEFT JOIN,然後緊接着用INNER JOIN連接到OUTER表。這使得一切都隱含INNER JOIN。

根據您的數據,我想請使用此:

FROM Task task 
LEFT JOIN Entry entry 
ON task.TaskId = entry.TaskId 
LEFT JOIN #weeks weeks 
ON entry.EntryDate BETWEEN weeks.BeginDate 
AND weeks.EndDate 

或者這樣:

FROM Task task 
LEFT JOIN (Entry entry 
    INNER JOIN #weeks weeks 
    ON entry.EntryDate BETWEEN weeks.BeginDate 
    AND weeks.EndDate) 
ON task.TaskId = entry.TaskId 

,你應該使用取決於​​和entry之間的確切關係。如果您的參賽作品沒有任何週數,並且您希望那些參賽作品包含在內,那麼第一個作品就很好。如果你不希望任何沒有任何周的參賽作品(或者沒有參賽周的參賽作品不應該是不可能的),那麼第二個是好的。

+0

這一切都沒有工作正確。 – bambi

+1

@bambi您將不得不比這更具描述性。 –

+0

@bambi你是否想說你希望你的結果有'#周'中的記錄,即使'entry'表中沒有任何數據?這應該如何工作? '#weeks'只和'entry'表有關'task'。除非你只是想要一個巨大的笛卡爾產品,否則你期望的結果是什麼? –