2014-10-29 48 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