我有一个带有两个表的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上)。
答案 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