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

这将为您提供每位员工的摘要,其中有几个假设:

  1. 假设 Analytics.Workday 中的 employee_ID 值是唯一值(一对一连接),要在比较中使用 WD.Adjusted_Hire_Date,您只需要将其包含在 GROUP BY 中。

  2. 假设每个 employee_Id 有多个课程,为了在比较中使用 mylearning.CourseTimeCompletedH,您需要将其包装在聚合中,例如 MAX.

这里需要注意的是,查询将检查每个员工最近完成的课程是否在 "hire_date" 表达式之前,所以我不确定这是否是您所追求的。

试一试,告诉我。