使用带有AND的Case语句以过滤SQL Server 2008的结果

时间:2014-01-17 16:05:14

标签: sql sql-server sql-server-2008 tsql case

我正在尝试建立一个声明,该声明将返回每个员工每天工作的工单数量。问题是员工可以在一天内多次处理工单(我只算作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  

2 个答案:

答案 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