2014-12-08 30 views
0

我正在尝试创建一个报告,概述一周内所有168个小时的时段,供人们注册。下面的查询列出了用户填写的基本数据,但我希望看到还未注册的插槽。显示带空白字段的星期日历

在此先感谢!

SELECT 
     p.[FirstName] 
    , p.[LastName] 
    , (SELECT TOP 1 [Value] 
     FROM [AttributeValue] av 
     INNER JOIN [Attribute] a ON a.[Id] = av.[AttributeId] 
     AND a.[EntityTypeId] = 113 
     AND a.[EntityTypeQualifierColumn] = 'WorkflowTypeId' 
     AND a.[EntityTypeQualifierValue] = w.[WorkflowTypeId] 
     WHERE [EntityId] = w.[Id] 
     AND a.[Key] = 'DayOfTheWeek' 
    ) AS [Day] 
    , (SELECT TOP 1 [Value] 
     FROM [AttributeValue] av 
     INNER JOIN [Attribute] a ON a.[Id] = av.[AttributeId] 
     AND a.[EntityTypeId] = 113 
     AND a.[EntityTypeQualifierColumn] = 'WorkflowTypeId' 
     AND a.[EntityTypeQualifierValue] = w.[WorkflowTypeId] 
     WHERE [EntityId] = w.[Id] 
     AND a.[Key] = 'Time' 
    ) AS [Time] 
FROM 
[Workflow] w 
INNER JOIN [PersonAlias] pa ON pa.Id = w.[InitiatorPersonAliasId] 
INNER JOIN [Person] p ON p.[Id] = pa.[PersonId] 
WHERE w.[WorkflowTypeId] = 1032 

回答

0

你可以建立所有在一周的日期之间的时间,然后你可以做一个左连接与您现有的查询来获取未使用的所有插槽。

declare @startDate datetime ='2014-11-23' 
declare @endDate datetime ='2014-11-30' 

;with cte 
as 
(
    your current query 
) 
, cte1 
as 
(
select datename(WEEKDAY, @startDate) as [day], datepart(hour, @startdate) as [time], 
     dateadd(hour, datediff(hour, 0, @startDate)+1, 0) as nextVal 
union all 
select datename(WEEKDAY, nextVal) as [day], datepart(hour, nextVal) as [time], 
     dateadd(hour, datediff(hour, 0, nextVal)+1, 0) as nextVal 
from cte1 
where nextVal<@endDate 
) 
select * from cte1 
left join cte 
on cte.day = cte1.day 
and cte.time = cte1.time 
OPTION (MAXRECURSION 168) 

要获得单独不使用所有插槽,可以加入其中cte.day是NULL条件