我尝试过查找并发现使用左外连接往往是答案,但这通常是对日期分组的总和而不是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个左外连接,我只是无法弄明白。我认为目前的加入是一个很好的替代品,实际上有一个虚拟年表,只显示至少已完成一些工作的年份。
这是我在这里发布的第一个问题,如果我忽略了一些信息或者遗漏了某些社区礼仪,那么就会有很多道歉。
感谢您的帮助!
答案 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