SQL强制插入虚拟数据

3
我有一个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列是一个实际日期的datename(以防万一可能会用到)。

{btsdaf} - JohnHC
2
{btsdaf} - MatSnow
{btsdaf} - Jorel Angelo Molato
2个回答

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

{btsdaf} - Jorel Angelo Molato
{btsdaf} - iamdave

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;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接