2014-10-29 47 views
0

我不确定这是否可以在MSSQL中完成。我有一个Timesheets表,我希望用户能够放入日期范围并查看该范围的所有时间表。需要注意的是,我也希望他们查看“缺失”时间表。推断缺少的表条目

用户每周进入时间表程序并创建一个时间表。当他们完成了几个小时后,他们提交时间表,然后他们的直线经理将批准时间表(这是相关的,与我一起)。

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

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 

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

回答

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!

+0

完美!感谢您的链接,这就是我需要的。 – Trent 2014-10-30 00:42:16

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 
+0

这个没有骰子。 'CROSS JOIN'没有'ON'子句并且将查询中的ON子句移动到'WHERE'产生与内连接相同的结果,这不是我不幸的事情。 http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx – Trent 2014-10-29 07:23:40

+0

Geez我已经离开游戏了一阵子。你的问题是,你没有一个表格列出了应该提交时间表的周数。说每周应该提交一个时间表是否公平?如果是这样,那么你可以生成每周的结果集,并将其加入。 – Lock 2014-10-29 07:39:15

+0

是的,我想我可能不得不这样做,每个星期都应该提交一个时间表。 – Trent 2014-10-29 07:54:22