总和为零的组不会显示

时间:2015-11-10 16:00:42

标签: tsql

我需要选择每周报告(每个任务类型每周的收入)。对于没有具有某种任务类型的条目的几个星期,我想打印0作为收入,但这些组不会出现在我的选择中。 #weeks是临时表,包含我想要报告的所有周数。我应该在查询中修改什么?

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季度的第二项任务 - 2015年11月15日,表条目中没有任何条目,但我仍然希望获得该周的行以及IncomePerWeek = 0的任务。

2 个答案:

答案 0 :(得分:0)

它是一个内连接,因此连接的两侧必须存在才能得到结果。 如果在参赛表中没有那个周的任何主题,你就不会得到结果。

从周全外连接任务中选择,这将为您提供周和任务的每个组合。然后在taskid和week上留下连接条目。你已经得到了将空值'转换'为0的合并。

SELECT weeks.BeginDate,
 weeks.EndDate,
 task.TaskId,
 task.Abbreviation,
 task.Name,
 COALESCE(SUM([entry.Income]), 0) AS IncomePerWeek 
FROM #weeks weeks,  Task Task 
LEFT JOIN Entry entry
ON task.TaskId = entry.TaskId 
and 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

答案 1 :(得分:-1)

尝试将GROUP BY ALL添加到查询中。