SQL强制插入虚拟数据

SQL强制插入虚拟数据,sql,sql-server,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 ) 这将返回如下结果: 但是,如果他们在某一天没有休息,则会导致: 有些日子不包括在

我有一个带有以下语句的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列是实际日期的日期名称(以防万一)

您需要向SQL Server提供所有要包含在查询中的数据,这些数据可以来自数据库中的表,也可以通过计算或显式包含

在您的情况下,您可以通过添加另一个
cte
来明确地将其包括在此处,该cte包括您的一周中的几天,并且
从该cte添加到您的
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

我想指出的是,您通常可以通过条件聚合来解决此类问题:

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;

这假设所有工作日都在原始数据中。在某些情况下,这种方法可能比左连接更简单。

创建一个包含一周中的天数的表,左连接您的CTE。可能重复@mats现在post和我的稍有相似,然而,我遗漏的关键点是在我的select语句中包含isnull,Dave谢天谢地回答了这个问题,而在另一篇文章中不需要(?)。不过谢谢你。:)谢谢我之前使用了类似的方法,但在加入时使用了CTEBreak作为我的主“表”。你太棒了。不,你太棒了,@JorelMolato