推断缺失的表条目

时间:2014-10-29 07:04:24

标签: sql-server

我不确定在MSSQL中是否可以这样做。我有一个Timesheets表,我希望用户能够输入日期范围并查看该范围的所有时间表。需要注意的是,我还希望他们查看“缺失”的时间表。

用户每周都会进入Timesheet程序并创建一个时间表。当他们完成输入时间后,他们提交时间表,然后他们的直线经理将批准时间表(这是相关的,请耐心等待。)

我遇到的问题是,如果他们从未创建给定周的时间表。我似乎无法让它出来。我有以下查询,它会告诉我用户是否没有为给定范围创建时间表,但如果有说,在给定范围内有3周,并且那些星期有1个时间表,则不会报告说有两个“缺失”的时间表。

SELECT U1.Name, T.EndDate,      
    CASE T.Submitted       
        WHEN 1 THEN 'Yes'       
        ELSE 'No'     
    END AS Submitted,   
    CASE T.Approved    
        WHEN 1 THEN 'Yes'    
        ELSE 'No'   
    END AS Approved    
FROM Users U1     
LEFT OUTER JOIN Timesheets T ON U1.idUser = T.id_User AND (T.EndDate <= '2014-10-24' AND T.EndDate >= '2014-10-03')
WHERE U1.Active = 1
ORDER BY U1.Name

从技术上讲,这两个日期将是参数,我只是将它们包含在内联中以使事情变得更容易。是否有可能做我想做的事情?

2 个答案:

答案 0 :(得分:1)

有许多技巧可以实现这一点,我最喜欢的是数字或计数表。您可以快速轻松地制作一个样本中的一个(示例中每个限制为5个)或谷歌周围更具创意的方式来列出一些数字。

花哨的递归cte

WITH tally ( n ) AS (
    SELECT 1 UNION ALL
    SELECT 1 + n FROM tally WHERE n < 5 )
SELECT n FROM tally

和内部sys表中的一个

SELECT number
FROM master..spt_values v
WHERE type = 'P' and number <= 5

您可以使用数字列表加入或应用,这样您就可以获得无间隙的范围。

这篇文章解释了使用计数器创建日期范围,应该让您入门。 link!

答案 1 :(得分:0)

select
  u.name,
  t.enddate,
  case t.submitted       
      when 1 then 'yes'       
      else 'no'     
  end as submitted,   
  case t.approved    
      when 1 then 'yes'    
      else 'no'   
  end as approved 
from
  timesheets t
cross join
  users u on
  u.iduser = t.id_user
where
  t.enddate <= '2014-10-24' 
  and t.enddate >= '2014-10-03'
  and u.active = 1