Plsql Case语句中的错误消息

Plsql Case语句中的错误消息,plsql,Plsql,我写了下面的语句,由于我添加了In子句,它不起作用。有人能提出一个可行的解决方案吗 我想做的是测量每个记录键的最小/最大等级值。有些分数不止一个,这就是为什么我添加了In子句,以便将其考虑在内 case when MIN("Grade - Current"."Grade Equivalency")=MIN("Grade - Current"."Grade Equivalency") IN (People." Record Key") then 'y' else 'n' end 表中的数据如下

我写了下面的语句,由于我添加了In子句,它不起作用。有人能提出一个可行的解决方案吗

我想做的是测量每个记录键的最小/最大等级值。有些分数不止一个,这就是为什么我添加了In子句,以便将其考虑在内

case when MIN("Grade - Current"."Grade Equivalency")=MIN("Grade - Current"."Grade Equivalency") 
IN (People." Record Key") then 'y' else 'n' end
表中的数据如下所示:

记录键版本等级

165 2009 1

165 2012 2

175 2009 1

189 2012 1

200 2009 2


200 2012 1

您已经有一个布尔条件: MINGrade-Current.Grade-Equivalency=MINGrade-Current.Grade-Equivalency在when中,因此也不能执行in子句

此外,当您在括号中使用IN子句时,必须将值而不是表列放入

也许你需要这样的东西:

case
when MIN("Grade - Current"."Grade Equivalency")=MIN("Grade - Current"."Grade Equivalency") AND MIN("Grade - Current"."Grade Equivalency") IN (one or more values...) then 'y' 
else 'n' 
end
第二个答案

它有点复杂,因为它使用分析函数

请看下面:

select RECORDKEY, VERSION_YEAR, GRADE,
case
  when GRADE_PREV = 0 and GRADE_NEXT >= 0 then 'Stayed the same'
  when GRADE_PREV = 0 and GRADE_NEXT > 0 then 'Stayed the same'
  when GRADE_PREV > 0 and GRADE_PREV < GRADE then 'increased'
  when GRADE_PREV > 0 and GRADE_PREV > GRADE then 'decreased'
  else null
end as grade_change
from
(
  select RECORDKEY, VERSION_YEAR, GRADE
  ,LAG(GRADE, 1, 0) over (partition by RECORDKEY order by RECORDKEY, VERSION_YEAR) as GRADE_PREV
  ,LEAD(GRADE, 1, 0) over (partition by RECORDKEY order by RECORDKEY, VERSION_YEAR) as GRADE_NEXT
  from PLCH_GRADES
)
order by 1,2
第三个答案

现在,它正在集成您的原始查询:

select RECORDKEY, CALENDAR_YEAR, HEADCOUNT, GRADE,
case
  when GRADE_PREV = 0 and GRADE_NEXT >= 0 then 'Stayed the same'
  when GRADE_PREV = 0 and GRADE_NEXT > 0 then 'Stayed the same'
  when GRADE_PREV > 0 and GRADE_PREV < GRADE then 'increased'
  when GRADE_PREV > 0 and GRADE_PREV > GRADE then 'decreased'
  else NULL
end as GRADE_CHANGE
from
(
  select RECORDKEY, CALENDAR_YEAR, HEADCOUNT, GRADE
  ,LAG(GRADE, 1, 0) over (partition by RECORDKEY order by RECORDKEY, VERSION_YEAR) as GRADE_PREV
  ,LEAD(GRADE, 1, 0) over (partition by RECORDKEY order by RECORDKEY, VERSION_YEAR) as GRADE_NEXT
  from 
  (
    select 
      PEOPLE."Record Key" as RECORDKEY, 
      CALENDAR.year as CALENDAR_YEAR, 
      "Grade - Current"."Grade Equivalency" as GRADE, 
      "Fact - People".HEADCOUNT  
    from test 
    where location = 'NI'
    and PEOPLE."Status Group" = 'CURRENT'
    and PEOPLE."Headcount Marker" in ('Paid', 'Unpaid')
    AND Calendar.Year IN ('2009', '2012') 
  )
)
order by 1,2

对不起,我无法理解您的要求。你能举一个输入和所需输出的例子吗?我创建了一个简单的报告,该报告着眼于2009年和2012年的成绩变化。报告中有3列:记录键、版本和等级。如果成绩在2009年和2012年之间发生了变化,或者在这两个年份都存在,则记录键可以出现在多行上。我想要一个语句,该语句将评估每个记录键的每一行,并针对它们添加一个组标记,因此,如果分数发生了变化,那么它是增加/减少了还是保持不变?能否更新您的问题并显示此报告的外观?我在报告的3列中添加了一些数据。我只想在额外的专栏中说增加,减少,保持不变等感谢你的回应,但这行不通。由于卷的原因,无法在此实例中声明值。我只想对照每个记录键检查每个等级,如果一个记录键出现多个等级,则评估它们,并说明它们是否增加、减少等。如果出现一个等级,则表示再次保持不变。我可以看到你在做什么,但我似乎无法适应我的原始代码。此外,我正在使用OBI中的答案,进入高级选项卡。这在这里应该行吗?我的原始代码是:选择人员。记录键saw_0,日历。年份saw_1,等级-当前。等级等效saw_2,事实-人员。人员编制saw_3,来自测试,位置='NI'和人员。状态组='Current'和人员。人员编制标记在'Paid'、'navel'和日历中。年份在'2009'中,saw_0发布的“2012”订单抱歉,我无法尝试此代码,但一旦尝试,我会让您知道它是如何运行的。