SQL force插入虚拟数据

时间:2017-10-23 09:08:06

标签: sql sql-server

我有一个带有以下语句的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列是实际日期的日期名称(以防它可能会发挥作用)

2 个答案:

答案 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更简单。