我需要选择每周报告(每种任务类型每周的收入)。对于某些星期没有任何任务类型条目的项目,我想将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月11日-2015年11月15日的表Entry中没有包含TaskId 2的任何条目,但是我仍然想获取该周的行以及IncomePerWeek = 0的任务。
以下作品:
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
“要点”是创建与周基数*任务(子查询笛卡尔积和with )一样多的条目。WT
RIGHT JOIN
entries
然后,IncomePerWeek
通过COALESCE
onNULL
值对条目的不存在进行正确处理以进行计算。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句