【问题标题】:Use Case Statement with AND in order to filter results SQL Server 2008使用带有 AND 的案例语句以过滤结果 SQL Server 2008
【发布时间】:2014-01-17 16:05:13
【问题描述】:

我正在尝试构建一个语句,该语句将返回每个员工每天处理的工单数量。问题是员工可以在一天内多次处理工作订单(我只会算作 1),或者他们可以在多天内多次处理工作订单(我会算作每天工作 1开)。

我可以使用带有AND 表达式的Case 语句来执行此操作吗?像这样:

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 然后我需要计算每个员工每天的工单,但我想先弄清楚如何做这部分,以便我可以验证我的数据。

我是否走在正确的道路上,或者我应该寻求以完全不同的方式做到这一点?也许是子报告?

示例数据库

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*  

因此,对于上述粗体部分,我会将其视为 2 个实例,因为工作是在 2 个不同的日子里完成的。

对于斜体部分,我想将其计为 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  

【问题讨论】:

  • 请输入和输出数据集示例?
  • WKE_LabDate 是什么数据类型?您使用的是什么版本的 SQL Server?
  • 我正在使用 SQL Server 2008,并且我正在使用 Sql server mgmnt studio。 WKE_LabDate 是一个日期时间数据类型

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


【解决方案1】:
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

【讨论】:

  • 嗨,匿名!这看起来对我有用!您能否解释一下为什么每个员工每天都会返回,但不排除在两天内工作的订单?我只在 SQL 中工作了大约 6 个月,任何其他信息都将非常有用,可以帮助我改进我的查询逻辑
  • GROUP BY id,date 表示原始数据被分成不同的桶,每个 (id,date) 对都有一个桶。然后COUNT() 将分别处理每个桶。使用 COUNT(DISTINCT ...) 意味着它只计算每个 (id,date) 存储桶的唯一工作订单,而不是该存储桶中的所有工作订单。
【解决方案2】:

不,你没有走在正确的道路上。这应该使用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

【讨论】:

  • 这对我来说更像是一条评论
  • 我可以在 Group By 语句中过滤吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多