Sql 如何为聚合添加Case语句

Sql 如何为聚合添加Case语句,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我有一个查询,可以获取时钟和中断时间异常。如果有人不休息,休息时间是负数。我需要报告“休息时间”,但是我需要将负休息时间更改为“0”,否则报告休息时间 我的问题是: SELECT lEmployeeID, sFirstName, sLastName, TotalHours, BreakTime, SkippedBreak, ShortBreak FROM ( SELECT lEmployeeID, sFirstName, sLastName, SUM(T

我有一个查询,可以获取时钟和中断时间异常。如果有人不休息,休息时间是负数。我需要报告“休息时间”,但是我需要将负休息时间更改为“0”,否则报告休息时间

我的问题是:

SELECT lEmployeeID, sFirstName, sLastName, 
       TotalHours, BreakTime, SkippedBreak, ShortBreak
FROM (
    SELECT lEmployeeID, sFirstName, sLastName, 
        SUM(TotalHours) AS TotalHours, 
        DATEDIFF(mi, MIN(dtTimeOut), MAX(dtTimeIn)) AS BreakTime, 
        CASE WHEN SUM(ftc.TotalHours) > 6 
              AND DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) < 0 
             THEN 1 
             ELSE 0 
        END AS SkippedBreak, 
        CASE WHEN DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) < 30 
              AND DATEDIFF(mi, MIN(ftc.dtTimeOut), MAX(ftc.dtTimeIn)) > 0 
             THEN 1 
             ELSE 0 
        END AS ShortBreak
    FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, 
                       @iActive, @EmployeeList) AS ftc
    WHERE (DID IS NOT NULL) 
       OR (DID IS NOT NULL) 
      AND (dtTimeOut IS NULL)
    GROUP BY lEmployeeID, sFirstName, sLastName
) AS sub
WHERE (SkippedBreak = 1) 
   OR (ShortBreak = 1)

我需要负的中断时间分钟数为“0”

将您的查询包装在外部查询中,该查询使用
大小写来处理负聚合值:

SELECT
    lEmployeeID, sFirstName, sLastName, TotalHours, 
    CASE WHEN BreakTime < 0 THEN 0 ELSE BreakTime END AS BreakTime,
    SkippedBreak, ShortBreak
FROM (
    <your current query>
) t
选择
lEmployeeID、sFirstName、sLastName、TotalHours、,
当中断时间小于0时,则为0,否则中断时间结束为中断时间,
短跑
从(
)t

可能重复的问题源自我对上一个问题的发现。这是另一个问题。我现在正在尝试更改“中断时间”的结果,如果它小于0,那么如果您为您要查找的查询提供一个简单的
输入
数据和相应的
输出
数据(结果),就会容易得多。
SELECT
    lEmployeeID, sFirstName, sLastName, TotalHours, 
    CASE WHEN BreakTime < 0 THEN 0 ELSE BreakTime END AS BreakTime,
    SkippedBreak, ShortBreak
FROM (
    <your current query>
) t