2014-12-08 2 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 условие

Смежные вопросы