在 CASE WHEN 中使用 SUM 时,无法对包含聚合或子查询的表达式执行聚合函数

Cannot perform an aggregate function on an expression containing an aggregate or a subquery when using SUM in CASE WHEN

当我尝试执行

时,此 SQL 查询失败

"WHEN SUM(CONVERT(decimal(10,2),DATEDIFF(second, t.Start, t.Finish ) / 3600.0)) > 8"

在我的案例陈述中。

SELECT e.EmployeeNumber, e.FirstName, e.LastName, cast(t.DateWorked as date) as DateWorked,
SUM(CONVERT(decimal(10,2),DATEDIFF(second, t.Start, t.Finish ) / 3600.0)) as HoursWorked,
SUM(CASE 
-- #Check for overtime# HoursWorked > DailyHours
WHEN SUM(CONVERT(decimal(10,2),DATEDIFF(second, t.Start, t.Finish ) / 3600.0)) > 8
    THEN 
        1
ELSE
        0
END) as moneyEarned
FROM Timesheets t, Employees e
WHERE cast(t.DateWorked as date) BETWEEN @datefrom AND @dateto
AND t.IsDeleted = 0
AND t.EmployeeId = e.EmployeeId
AND t.FarmId = @farmid
GROUP BY e.EmployeeNumber, e.FirstName, e.LastName, cast(t.DateWorked as date)

有没有一种方法可以在我的 Case 语句中将 "HoursWorked" 作为变量访问?

目前我遇到 "Cannot perform an aggregate function on an expression containing an aggregate or a subquery." 错误。

任何关于我如何以不同方式处理这个问题的建议都将不胜感激。

您在 sum() 中有一个 sum(),这是不允许的。据推测,您打算:

SELECT e.EmployeeNumber, e.FirstName, e.LastName,
       cast(t.DateWorked as date) as DateWorked,
       SUM(CONVERT(decimal(10,2),DATEDIFF(second, t.Start, t.Finish ) / 3600.0)) as HoursWorked,
       (CASE -- #Check for overtime# HoursWorked > DailyHours
             WHEN SUM(CONVERT(decimal(10,2),DATEDIFF(second, t.Start, t.Finish ) / 3600.0)) > 8
             THEN 1 ELSE 0
       END) as moneyEarned
. . .

您还应该学习使用正确的显式 join 语法。