SQL强制插入虚拟数据
我有一个带有以下语句的CTE来获取用户一天的总休息时间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 ) 这将返回如下结果: 但是,如果他们在某一天没有休息,则会导致: 有些日子不包括在
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