我正在尝试建立一个声明,该声明将返回每个员工每天工作的工单数量。问题是员工可以在一天内多次处理工单(我只算作1),或者他们可以在多天工作多次工作(我每天工作1次)上)。
我可以使用带有Case
表达式的AND
语句来执行此操作吗?像这样的东西:
SELECT
WKE_EmployeeID, WKE_LabDate, WKE_RecordID,
'WorkOrder' = CASE
WHEN WKE_WorkOrderID = WKE_WorkOrderID AND WKE_LabDate = WKE_LabDate
THEN (Select Distinct WKE_WorkOrderID)
ELSE WKE_WorkOrderID
FROM
dbo.WKE
WHERE
(WKE_EmployeeID IN (N'sweda', N'bakja', N'gebwa'))
AND (WKE_LabDate BETWEEN @FromDate AND @ToDate)
ORDER BY
WKE_WorkOrderID
这只是当然的第一部分,b / c然后我需要计算每个员工每天的工作量,但我想弄清楚如何首先完成这部分,以便我可以验证我的数据。
我是在正确的道路上,还是应该以完全不同的方式做到这一点?也许子报告?
SAMPLE DB
WKO employee date
RW19800 bakja 1/6/14 12:00 AM
RW20573 gebwa 1/2/14 12:00 AM
RW20574 gebwa 1/2/14 12:00 AM
RW20600 gebwa 1/10/14 12:00 AM
**RW20602 gebwa 1/2/14 12:00 AM
RW20602 gebwa 1/7/14 12:00 AM**
*RW20603 bakja 1/8/14 12:00 AM
RW20603 bakja 1/8/14 12:00 AM*
因此,对于上面的BOLDED部分,我将其视为2个实例,因为工作是在2天内完成的。
对于Italicized部分,我想将其视为1个实例,因为工作在同一天完成了两次。
最终输出示例示例:
date WKO Count employee
1/2/14 12:00 AM 3 gebwa
1/6/14 12:00 AM 1 bakja
1/7/14 12:00 AM 1 gebwa
1/8/14 12:00 AM 1 bakja
1/10/14 12:00 AM1 gebwa
答案 0 :(得分:3)
不,你没有走正确的道路。这应该只使用GROUP BY
完成。
它看起来像这样:
select EmployeeID, Year, Month, Day, Count(*) as Count
from (
--get one row per employee/workorder/day
select EmployeeID, WorkOrderID, year(date) as Year, month(date) as Month, day(date) as Day
from WorkOrder
where EmployeeID in (N'sweda', N'bakja', N'gebwa')
and date between @FromDate and @ToDate
group by EmployeeID, WorkOrderID, year(date), month(date), day(date)
) a
group by EmployeeID, Year, Month, Day
答案 1 :(得分:3)
SELECT WKE_EmployeeID, WKE_LabDate, COUNT(DISTINCT WorkOrderID)
FROM dbo.WKE
WHERE EmployeeID IN (N'sweda', N'bakja', N'gebwa')
AND Date BETWEEN @FromDate AND @ToDate
GROUP BY WKE_EmployeeID, WKE_LabDate