需求
对某时间指标做分类,如果工单未完成(结束时间为空),则为“未结单”;否则,若工单超时,则为“未达标”;其余则为“达标”。
可见,指标结果分为3类:
未结单=COMPLETE_TIME IS NULL
达标=COMPLETE_TIME IS NOT NULL AND COMPLETE_TIME<=PLAN_FINISHED_TIME
未达标=COMPLETE_TIME IS NOT NULL AND COMPLETE_TIME>PLAN_FINISHED_TIME
数据
方法
首先,利用NVL2()函数,判断COMPLETE_TIME是否为空,为空则'未结单';
然后,利用DECODE()函数和SIGN()函数,判断差值是否大于0,大于0则为'未达标',否则为'达标'。
其中
- NVL2(表达式1,表达式2,表达式3)
3目表达式,如果'表达式1'为空,则返回'表达式3'的值;如果'表达式1'不为空,则返回'表达式2'的值。注意顺序与NVL()的区别。
- DECODE(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
多目表达式,此处只用到一种判断值,即DECODE(表达式,值,返回值,缺省值)。
如果,'表达式'等于'值',则返回'返回值',否则返回'缺省值'。
但是,DECODE只能判断是否相等,无法比较大小,可以与SIGN函数组合,实现比较大小的目的。
- SIGN(value)
SIGN(value)函数会根据value的值为0,正数,负数,分别返回0,1,-1
综上可见,通过sign对需要比较大小的式子做转换,得到0,1,-1后,即可以用decode来判断。
由于此场景只需要判断差值大于0还是小于等于0,共2种情况,所以按照下述方法可以实现目的。
SELECT
SIGN(COMPLETE_TIME-PLAN_FINISHED_TIME) AS SIGN_FLAG,
NVL2(COMPLETE_TIME, DECODE(SIGN(COMPLETE_TIME-PLAN_FINISHED_TIME), 1, '未达标', '达标'), '未结单') AS STATE
FROM
PLAN