2010-09-09 120 views
2

鑑於這兩個(簡化)表:跳過行(發現基於開始日期結束日期和工作日)

Task (list of tasks/employee with their start date and estimated cost) 
--------- 
TaskId: int 
EmpId: int 
Start: Date 
Days: int 

WorkableDays (list of working dates/employee - i.e., without weekends/holidays) 
--------- 
EmpId: int 
Day: Date 

有什麼辦法只使用訪問SQL得到這個結果(或任何對於這個問題的其他SQL)?

TaskId, EmpId, EndDate 

編輯:如果它簡化了事情的任何,這是每個任務的一個員工(taskid的是這裏的唯一鍵,而不是任務id + EMPID)

(我包括EMPID爲了完整起見,我不確定它是否與這個問題有關)

注意:我認爲我在推動我的這個運氣,但我試圖弄清楚我是否可以在SQL中完成。

回答

2

你可以有一個where條款,說必須有開始和結束日期之間的N個工作日。與row_number()變體不同,這應該在MS Access中起作用。例如:

declare @Task table (taskid int, empid int, start date, days int) 
insert @Task values (1, 1, '2010-01-01', 1) 
insert @Task values (2, 1, '2010-01-01', 2) 
insert @Task values (3, 1, '2010-01-01', 3) 

declare @WorkableDays table (empid int, day date) 
insert @WorkableDays values (1, '2010-01-01') 
insert @WorkableDays values (1, '2010-01-02') 
insert @WorkableDays values (1, '2010-01-05') 

select t.taskid 
,  t.start 
,  endday.day as end 
from @Task t 
join @WorkableDays endday 
on  endday.empid = t.empid 
where t.days = 
     (
     select COUNT(*) 
     from @WorkableDays wd 
     where wd.empId = t.empId 
       and wd.day between t.start and endday.day 
     ) 

此打印:

taskid start  end 
1  2010-01-01 2010-01-01 
2  2010-01-01 2010-01-02 
3  2010-01-01 2010-01-05 
+0

非常好,有一個小小的更正(閱讀編輯),這個答案的作品。非常感謝你! – Benjol 2010-09-09 12:21:46

0

不知道有關訪問,我很害怕,但在T-SQL,我會做這樣的事情(員工1,任務1,在這個例子中):

SELECT 
    TaskId, 
    EmpId, 
    Day AS EndDate 
FROM 
    (
     SELECT 
      task.TaskId, 
      task.EmpId, 
      task.Days, 
      WorkableDays.Day, 
      RANK() OVER (PARTITION BY task.EmpID, task.TaskID ORDER BY Day ASC) 'TaskActualDayNumber' 
     FROM 
      task 
       INNER JOIN WorkableDays ON task.empID = WorkableDays.empID AND WorkableDays.Day >= task.Start 
     WHERE 
      task.EmpID = 1 AND 
      task.TaskID = 1 
    ) CalculateDayNumbers 
WHERE 
    Days = TaskActualDayNumber 

內部查詢將按照WorkableDays中可用天數的升序對未來任務的日期進行排序,因此在開始日期之後的所有未來日期中都會預測「此任務的日期」值。然後,外部查詢只選擇一個值,其中該日數與該任務估計的天數一致。

編輯:正如Michael Pakhantsov指出的,ROW_NUMBER()在這種情況下會產生與RANK()相同的結果,我認爲。

+0

謝謝!正如你所說,沒有太多的Access吞嚥的機會:)只是出於好奇,是在任務的前面#開始一個錯字? – Benjol 2010-09-09 10:32:31

+0

@Benjol哎呀!是的,這是一個錯字 - 我使用臨時表(用SQL Server上的#表示)測試了這個錯誤,並且在我編輯表名時回到原來的位置時錯過了一個... – 2010-09-09 10:34:42

0
在T-SQL

 SELECT o.TaskId, o.EmpId, o.Date 
FROM 
(
SELECT TaskId, EmpId, t.Days, w.date, ROW_NUMBER() OVER(PARTITION BY w.EmpId order BY w.Date) DayNumber 
FROM Task t, DayNumberWorkableDays w 
WHERE t.EmpId = w.EmpId 
AND w.Date >= t.Start 
) o 
WHERE o.DayNumber = o.Days 
+0

您應該可以在TaskID上進行分區 – Andomar 2010-09-09 10:33:46

相關問題