如果按多个字段分组,如何获得0总和?

时间:2016-04-18 17:30:35

标签: sql sql-server sql-server-2008-r2

我尝试过查找并发现使用左外连接往往是答案,但这通常是对日期分组的总和而不是2级分组。我认为额外的分组会搞砸我。

我的表:

dbo._Labour

_id int pk - 此人工条目的身份
_date date - 此条目的日期(使用此按年份分组)
_activityid int - 他们正在做什么类型的活动
_typeid int --3可能的选项(0,1,2),它们在什么类型的项目上执行活动 _hours numeric(4,0) - 执行该活动花费了多少小时。

我的最终目标是每年知道3种类型(0,1,2)中每种类型的总工作时间。我目前的代码:

select coalesce(SUM(_hours),0) as _hours, YEAR(_date) as _year, l._typeid 
from RelayTanks.dbo._Labour l 
left outer join (select YEAR(_date) as _y 
from RelayTanks.dbo._Labour group by YEAR(_date)) y on y._y = YEAR(l._date) 
where _activityid in (3,4,9,11) 
group by YEAR(_date), l._typeid 
order by year(_date), l._typeid'

导致:

_typeid _year   _hours
0   2015    1174
1   2015    3953
2   2015    851
0   2016    119
1   2016    541
2   2016    65
1   2017    10

我正在寻找的是2017年为_typeid 0显示_hours 0而为_typeid 2显示为0. ie:

_typeid _year   _hours
0   2015    1174
1   2015    3953
2   2015    851
0   2016    119
1   2016    541
2   2016    65
0   2017    0    
1   2017    10
2   2017    0

我尝试了很多东西,包括2个左外连接,我只是无法弄明白。我认为目前的加入是一个很好的替代品,实际上有一个虚拟年表,只显示至少已完成一些工作的年份。

这是我在这里发布的第一个问题,如果我忽略了一些信息或者遗漏了某些社区礼仪,那么就会有很多道歉。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果你只需要用一个表来做这个,那么这样的事情可能有效。

SELECT  s._typeid,
        s._y,
        coalesce(SUM(lj._hours),0) as _hours
FROM
(   
    SELECT t._typeid, y._y
    FROM    (SELECT DISTINCT _typeid FROM RelayTanks.dbo._Labour) t
            CROSS JOIN 
            (SELECT DISTINCT YEAR(_date) _y FROM RelayTanks.dbo._Labour) y
) s
LEFT JOIN RelayTanks.dbo._Labour lj ON lj._typeid = s._typeid AND YEAR(lj._date) = s._y

性能可能很糟糕..您可能要考虑为_date.year值添加计算列

答案 1 :(得分:0)

假设您的数据中已经显示了所有可能的年份和类型,那么这将帮助您实现目标:

SELECT year(_date), _typeid, _hours = SUM(_hours)
FROM _Labour
GROUP BY year(_date), _typeid
UNION
SELECT year(y._date), t._typeid, 0
FROM _Labour y, _Labour t
WHERE NOT EXISTS (SELECT 1 FROM _Labour WHERE year(_Labour._date) = year(y._date) AND _Labour._typeid = t._typeid)
ORDER BY 1, 2