case 表达式中的聚合函数错误
aggregate function error in case expression
我有这个问题
SELECT mylearning.Employee_Id,
case
when max(case when not mylearning.CourseStatusTXT = 'Completed' then 1 else 0 end) = 0 then '2018 Complete'
when max(case when mylearning.CourseStatusTXT in ('Started', 'Not Started') then 1 else 0 end) = 1 then '2018 Not Complete'
end as Completion_Status
FROM Analytics.myLearning_Completions as mylearning inner join Analytics.Workday WD on mylearning.Employee_ID = WD.Employee_ID
我想在第一个 when 语句中添加一个条件,使其成为这样
when max(case when not mylearning.CourseStatusTXT = 'Completed' then 1 else 0 end) = 0
and WD.Adjusted_Hire_Date like '2019% '
and mylearning.CourseTimeCompletedH < cast (WD.Adjusted_Hire_Date as date format 'YYYY/MM/DD') +7
then '2018 Complete'
但我一直收到此错误
Executed as Single statement. Failed [3504 : HY000] Selected non-aggregate values must be part of the associated group.
Elapsed time = 00:00:00.069
我该如何解决?
这里的问题是您在与组或聚合数据相同的查询中逐行混合详细信息。聚合数据将为所有行输出单个值,除非您有 group by 子句。如果您有一个 group by 子句,那么它将为每个组输出一个值。当您分组时,您还可以包括分组依据子句中的任何值,因为它们对于组来说是唯一的。
如果您想要每个员工的此数据,则可以按 employee_id 分组。任何其他数据也需要像 Max(Adjusted_Hire_Date)
这样的聚合
也许这就是你想要的?
SELECT
mylearning.employee_id
, case
when CourseStatusTXT = 'Completed' and WD.Adjusted_Hire_Date like '2019%'
and mylearning.CourseTimeCompletedH < cast (WD.Adjusted_Hire_Date as date format 'YYYY/MM/DD') +7
then '2018 Complete'
else '2018 Not Complete'
end CompletionStatus
FROM myLearning_Completions mylearning, Workday WD
WHERE mylearning.employee_id = WD.employee_id
就像提到的其他几个一样,您试图在计算中混合分组数据和非聚合数据,这就是您收到 3504
错误的原因。您需要在 GROUP BY
中包含引用的列,或者将它们包含在聚合函数(即 MAX)中。
我不是 100% 确定这是否是您想要的,但希望它可以帮助您。
SELECT
mylearning.Employee_Id,
CASE
WHEN
MAX(CASE WHEN NOT mylearning.CourseStatusTXT = 'Completed' THEN 1 ELSE 0 END) = 0 AND
WD.Adjusted_Hire_Date like '2019% ' AND
-- Check if most recently completed course is before Hire (Date + 1 week)
MAX(mylearning.CourseTimeCompletedH) <
CAST(WD.Adjusted_Hire_Date AS DATE FORMAT 'YYYY/MM/DD') + 7
THEN '2018 Complete' -- No incomplete learnings
WHEN MAX(
CASE WHEN mylearning.CourseStatusTXT IN ('Started', 'Not Started') THEN 1 ELSE 0 END
) = 1 THEN '2018 Not Complete' -- Started / Not Started learnings exist
END AS Completion_Status
FROM Analytics.myLearning_Completions as mylearning -- Get learning info
INNER JOIN Analytics.Workday WD on mylearning.Employee_ID = WD.Employee_ID -- Employee info
GROUP BY mylearning.Employee_Id, WD.Adjusted_Hire_Date
这将为您提供每位员工的摘要,其中有几个假设:
假设 Analytics.Workday
中的 employee_ID
值是唯一值(一对一连接),要在比较中使用 WD.Adjusted_Hire_Date
,您只需要将其包含在 GROUP BY
中。
假设每个 employee_Id
有多个课程,为了在比较中使用 mylearning.CourseTimeCompletedH
,您需要将其包装在聚合中,例如 MAX
.
这里需要注意的是,查询将检查每个员工最近完成的课程是否在 "hire_date" 表达式之前,所以我不确定这是否是您所追求的。
试一试,告诉我。
我有这个问题
SELECT mylearning.Employee_Id,
case
when max(case when not mylearning.CourseStatusTXT = 'Completed' then 1 else 0 end) = 0 then '2018 Complete'
when max(case when mylearning.CourseStatusTXT in ('Started', 'Not Started') then 1 else 0 end) = 1 then '2018 Not Complete'
end as Completion_Status
FROM Analytics.myLearning_Completions as mylearning inner join Analytics.Workday WD on mylearning.Employee_ID = WD.Employee_ID
我想在第一个 when 语句中添加一个条件,使其成为这样
when max(case when not mylearning.CourseStatusTXT = 'Completed' then 1 else 0 end) = 0
and WD.Adjusted_Hire_Date like '2019% '
and mylearning.CourseTimeCompletedH < cast (WD.Adjusted_Hire_Date as date format 'YYYY/MM/DD') +7
then '2018 Complete'
但我一直收到此错误
Executed as Single statement. Failed [3504 : HY000] Selected non-aggregate values must be part of the associated group.
Elapsed time = 00:00:00.069
我该如何解决?
这里的问题是您在与组或聚合数据相同的查询中逐行混合详细信息。聚合数据将为所有行输出单个值,除非您有 group by 子句。如果您有一个 group by 子句,那么它将为每个组输出一个值。当您分组时,您还可以包括分组依据子句中的任何值,因为它们对于组来说是唯一的。
如果您想要每个员工的此数据,则可以按 employee_id 分组。任何其他数据也需要像 Max(Adjusted_Hire_Date)
这样的聚合也许这就是你想要的?
SELECT
mylearning.employee_id
, case
when CourseStatusTXT = 'Completed' and WD.Adjusted_Hire_Date like '2019%'
and mylearning.CourseTimeCompletedH < cast (WD.Adjusted_Hire_Date as date format 'YYYY/MM/DD') +7
then '2018 Complete'
else '2018 Not Complete'
end CompletionStatus
FROM myLearning_Completions mylearning, Workday WD
WHERE mylearning.employee_id = WD.employee_id
就像提到的其他几个一样,您试图在计算中混合分组数据和非聚合数据,这就是您收到 3504
错误的原因。您需要在 GROUP BY
中包含引用的列,或者将它们包含在聚合函数(即 MAX)中。
我不是 100% 确定这是否是您想要的,但希望它可以帮助您。
SELECT
mylearning.Employee_Id,
CASE
WHEN
MAX(CASE WHEN NOT mylearning.CourseStatusTXT = 'Completed' THEN 1 ELSE 0 END) = 0 AND
WD.Adjusted_Hire_Date like '2019% ' AND
-- Check if most recently completed course is before Hire (Date + 1 week)
MAX(mylearning.CourseTimeCompletedH) <
CAST(WD.Adjusted_Hire_Date AS DATE FORMAT 'YYYY/MM/DD') + 7
THEN '2018 Complete' -- No incomplete learnings
WHEN MAX(
CASE WHEN mylearning.CourseStatusTXT IN ('Started', 'Not Started') THEN 1 ELSE 0 END
) = 1 THEN '2018 Not Complete' -- Started / Not Started learnings exist
END AS Completion_Status
FROM Analytics.myLearning_Completions as mylearning -- Get learning info
INNER JOIN Analytics.Workday WD on mylearning.Employee_ID = WD.Employee_ID -- Employee info
GROUP BY mylearning.Employee_Id, WD.Adjusted_Hire_Date
这将为您提供每位员工的摘要,其中有几个假设:
假设
Analytics.Workday
中的employee_ID
值是唯一值(一对一连接),要在比较中使用WD.Adjusted_Hire_Date
,您只需要将其包含在GROUP BY
中。假设每个
employee_Id
有多个课程,为了在比较中使用mylearning.CourseTimeCompletedH
,您需要将其包装在聚合中,例如MAX
.
这里需要注意的是,查询将检查每个员工最近完成的课程是否在 "hire_date" 表达式之前,所以我不确定这是否是您所追求的。
试一试,告诉我。