Plsql Case语句中的错误消息
我写了下面的语句,由于我添加了In子句,它不起作用。有人能提出一个可行的解决方案吗 我想做的是测量每个记录键的最小/最大等级值。有些分数不止一个,这就是为什么我添加了In子句,以便将其考虑在内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 表中的数据如下
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”订单抱歉,我无法尝试此代码,但一旦尝试,我会让您知道它是如何运行的。