我想查询数据库中的用户以及他们在每个活动类别上花费的时间。这些类别存储在表 ActivityCategory (int Id, varchar Name) 中。其中只有 8 个,我希望看到所有这些,即使没有人花时间在特定类别上。
我有以下查询:
select u.NoEmploye, u.FirstName, u.LastName, Total=sum(h.NbHeures), ac.Name
from Users u
join Semaines s on u.EntityGuid=s.UserGuid
join HeuresProjets hp on s.Id=hp.WeekId
join Heures h on hp.HPId=h.HpGuid
join ActivityCodes code on h.Code=code.ActivityId
join ActivityCategory ac on code.Categorie=ac.Id
group by u.NoEmploye, u.FirstName, u.LastName, ac.Name
order by u.NoEmploye
它工作正常,但不会返回未使用的 ActivityCategories。我尝试了全/左/右/内/外/you-name-it 连接的每一种组合。当没有人使用某个类别时,我能得到的最好结果是完全为空的行,而特定用户不使用但其他人使用的类别为空 ac.Name。我怀疑这group by [...]
ac.Name
部分是什么“吃”了未使用的类别。我究竟做错了什么?我应该编写第二个选择查询来对结果进行分组吗?我将有十几个类似的查询要写,所以我想理解而不是仅仅有一个没有解释的固定查询。
编辑 Lamak 的第二个查询到目前为止有效,但是当我添加 where 子句时它有同样的问题。
EDIT2 ypercube' 编辑工作完美
现在让我们看看我是否正确理解了查询。当结果为空时,我将 Sum 与 0 合并以获得适当的值。我从 ActivityCategory 开始选择,以确保我拥有所有这些,甚至是未使用的,我与用户交叉加入以获得 ActivityCategory 和用户的每种组合。我离开 join Activitycodes 只获取相关行,然后我内部加入我的其他表以到达 Semaine。我的条件适用于 Semaine 表的连接,因为我想在交叉连接之前过滤我的数据。最后,我按用户和 ActivityCategory 对我的数据进行分组,以使总和有效。