我有一个带有以下语句的CTE,以获取一天中用户的总休息时间。
CTEBreak as
(
select max(name) as Name
,sum(DurationInHours) as HourlyBreak
,Work_Day
from ctesemifinal
where id in (4130)
group by Work_Day
)
这会返回如下结果:
但是,如果他们在某一天没有休息,则会导致:
有些日子不包括在内,因为他没有休息。我想要的是强制插入' 1'在用户没有休息的日子里。我该如何做到这一点?谢谢!
顺便说一句,Work_Day列是实际日期的日期名称(以防它可能会发挥作用)
答案 0 :(得分:5)
您需要向SQL Server提供要包含在查询中的所有数据,可以从数据库中的表中,通过计算或明确包含它。
在您的情况下,您可以通过添加另一个cte
来明确地将其添加到此处,其中包含您的一周中的某些日期,并left join
将其添加到您的CTEBreak
:
with
...
,CTEBreak as (...)
,CTEWorkdays(wd) as (select 'Monday' union all
select 'Tuesday' union all
select 'Wednesday' union all
select 'Thursday' union all
select 'Friday'
)
select isnull(b.HourlyBreak,1) as HourlyBreak
,w.wd as Work_Day
from CTEWorkdays as w
left join CTEBreak as b
on w.wd = b.Work_Day
答案 1 :(得分:1)
我想指出,您通常可以使用条件聚合解决此类问题:
select max(case when id = 4130 then name end) as Name,
max(case when id = 4130 then DurationInHours else 1 end) as HourlyBreak,
Work_Day
from ctesemifinal
group by Work_Day;
这假设所有工作日都在原始数据中。在某些情况下,这种方法可能比left join
更简单。