2

我有一个带有两个表 worktodo 和 workdone 的 MS SqlServer 2008 数据库:

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

我正在寻找一个查询,该查询将为每个工作人员返回工作任务的总数和迟到的工作任务的总数,其中迟到定义为 donedate > duedate 或 duedate > NOW 并且没有 workdone 记录。

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

有任何想法吗?

编辑:添加示例数据:

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

Bill 有一个 worktodo,它没有子 workdone。但是因为到期日在未来,所以他有一个工单,没有迟到的工单。

Fred 有一个 worktodo,它没有子 workdone。但是因为到期日是过去的,所以他有一份工单和一份迟到的工单。

乔有两个工作要做。工单 10001 的截止日期为 2012 年 1 月 1 日,但直到 2012 年 1 月 31 日才完成,所以为时已晚。工单 10002 的截止日期为 2012 年 1 月 2 日,但它最早的工作是在 2011 年 12 月 30 日之前完成的,所以还不算晚。10002 的另一个 workdone 的 donedate 晚于到期日没有相关性。这导致乔有两个工单和一个迟到的工单。

(另外 - 假设 workorder 是 worktodo 上的主键)。

4

1 回答 1

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

如果给定工单有多个 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
于 2013-05-21T21:33:05.313 回答