在 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
语法。
当我尝试执行
时,此 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
语法。