加入最早的儿童纪录

时间:2013-05-21 21:15:09

标签: sql sql-server

我有一个带有两个表的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
);

我正在寻找一个查询,它将为每个工作人员返回工作总数和后期工作总数,其中迟到被定义为捐赠者> duedate,或duedate>现在并没有工作记录。

在代码中做的很简单,但我需要一个可以由一个相当简单的报告工具运行的查询。

有什么想法吗?

已编辑:添加了样本数据:

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
比尔有一个工作组,没有儿童工作。但是因为将来是duedate,所以他有一个工作单而且没有迟到的工作人员。

弗雷德有一个worktodo,它没有儿童工作。但是因为duedate过去,所以他有一个工作单和一个晚期工作单。

乔有两个工作组。工作订单10001有一个2012-01-01的延期,但直到2012-01-31才完成,所以已经晚了。工作订单10002有一个2012-01-02的duedate,但它最早的工作是在此之前完成的,在2011-12-30,所以它没有迟到。还有另一个10002的工作,其中一个晚于duedate的捐赠者没有任何相关性。这导致乔有两个工作人员和一个迟到的工作单。

(另外 - 假设工作单是主键,在worktodo上)。

1 个答案:

答案 0 :(得分:1)

您可以使用SUM(CASE比较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

如果给定工作单的多个workdone记录。

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