2013-05-21 46 views
2

我有一個MS SqlServer的2008數據庫有兩個表,worktodo和workdone:與最早的子記錄加入

CREATE TABLE worktodo 
(
    workorder VARCHAR(32), 
    worker VARCHAR(64), 
    duedate DATETIME, 
    PRIMARY KEY workorder 
); 
CREATE TABLE workdone 
(
    workorder VARCHAR(32), 
    donedate DATETIME 
); 

而且我正在尋找一個查詢,將返回,每個工人,總數worktodos,以及遲到的worktodos的總數,其中遲到定義爲donedate> duedate,或duedate> NOW,並且沒有任何記錄。

在代碼中做的不重要,但我需要一個可以由一個相當簡單的報告工具運行的查詢。

任何想法?

編輯:新增樣本數據:

worktodo: 
workorder worker duedate 
10001  JOE  2012-01-01 
10002  JOE  2012-01-02 
10003  FRED 2012-01-03 
10004  BILL 2013-12-31 

workdone: 
worker  donedate 
10001  2011-01-01 
10002  2011-12-30 
10002  2012-01-04 

Desired: 
worker num_total_workorders num_late_workorders 
BILL  1      0 
FRED  1      1 
JOE  2      1 

比爾有一個worktodo,它沒有孩子workdones。但是因爲行將在未來,所以他有一份工作單,而且沒有遲到的工作單。

弗雷德有一個worktodo,沒有孩子工作。但是因爲過去是這樣的,所以他有一份工作單和一份晚的工作單。

喬有兩個worktodos。 Workorder 10001有一個2012-01-01的截止日期,但直到2012-01-31才完成,所以已經晚了。 Workorder 10002有一個2012-01-02的管理者,但最早的工作是在2011年12月30日之前完成的,所以它不會遲到。還有另外一個對於10002而言晚於duedate的捐贈者沒有意義。這導致Joe有兩個工作單位,一個晚工單。

(另外 - 假設workorder是主鍵,在worktodo上)。

+2

可用的樣品數據和理想的結果? –

+0

是否donedate是一個可空列的工作? – Tim

回答

1

您可以使用SUM(CASE comparison THEN 1 ELSE 0 END)來總計比較爲真的所有情況。喜歡這個。我假設一個給定的工單將只有一個工作記錄。

SELECT worktodo.worker, COUNT(worktodo.workorder) AS TotalWorkToDo, 
    SUM(CASE WHEN (workdone.workorder IS NULL AND duedate < getdate()) 
     OR donedate > duedate 
    THEN 1 ELSE 0 END) AS TotalLateWorkToDo 
FROM worktodo 
LEFT OUTER JOIN workdone 
    ON worktodo.workorder = workdone.workorder 
GROUP BY worktodo.worker 

如果給定工單的多個工作單記錄。

SELECT worktodo.worker, COUNT(worktodo.workorder) AS TotalWorkToDo, 
    SUM(CASE WHEN (workdone.workorder IS NULL AND duedate < getdate()) 
     OR donedate > duedate 
    THEN 1 ELSE 0 END) AS TotalLateWorkToDo 
FROM worktodo 
LEFT OUTER JOIN 
    (SELECT workorder, min(donedate) AS donedate FROM workdone 
     GROUP BY workorder) as workdone 
    ON worktodo.workorder = workdone.workorder 
GROUP BY worktodo.worker 
+0

對於任何給定的工單將有多個工作日記錄,因此您的第一個示例不適用。至於你的第二個,它缺少GROUP BY。 –

+0

添加了(男孩很尷尬)。我包括兩個版本,因爲我不確定它是1:1還是1:多的關係。 –

+0

列'worktodo.worker'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 –