我需要选择每周报告(每个任务类型每周的收入)。对于没有具有某种任务类型的条目的几个星期,我想打印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的任务。
答案 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添加到查询中。