我正在使用以下查询
SELECT d.mon,
CASE
WHEN MAX(CASE WHEN d.DRR = '80+' THEN 9999 ELSE TO_NUMBER(substr(d.DRR,1,INSTR(d.DRR, '-') - 1)) END) = 9999 THEN '80+'
WHEN MAX(CASE WHEN d.DRR = 'CURR' THEN 0 ELSE TO_NUMBER(substr(d.DRR,1,INSTR(d.DRR, '-') - 1)) END) = 0 THEN 'CURR'
ELSE(
TO_CHAR(max(TO_NUMBER(substr(d.DRR,1,INSTR(d.DRR, '-') - 1)))) || '-' ||
TO_CHAR(MAX( TO_NUMBER(substr(d.DRR,INSTR(d.DRR, '-') +1)) ))))
END
AS bill
FROM table d
GROUP BY d.mon
ORDER BY d.mon
但它给了我无效的数字。我有以下数据集:
我 | 减灾 |
---|---|
1 | 80+ |
1 | 1-30 |
它应该导致:
我 | 减灾 |
---|---|
1 | 80+ |
在我添加以下条件之前它不起作用:
TO_CHAR(MAX(CASE WHEN d.DRR = 'CURR' THEN 0 WHEN d.DRR = '80+' THEN 1 ELSE TO_NUMBER(substr(d.DRR,INSTR(d.DRR, '-') +1)) END))
为什么我需要在满足第一个条件的情况下添加这个条件。
当然,您遇到了“号码无效”错误。那是因为您尝试将 to_number
函数应用于此
substr
:的结果
SQL> WITH
2 table1 (mon, drr)
3 AS
4 (SELECT 1, '80+' FROM DUAL
5 UNION ALL
6 SELECT 1, '1-30' FROM DUAL)
7 SELECT SUBSTR (d.DRR, INSTR (d.DRR, '-') + 1) --> this
8 FROM table1 d;
SUBS
----
80+ --> this is where TO_NUMBER fails
30
SQL>
该查询应该做什么?条件看起来有点。您需要使用max
功能吗?如果是这样,为什么?您正在比较两个值,所以也许您只需要使用
greatest
?您能用简单的英语解释一下您想要解决什么问题吗?必须对 source数据应用哪些规则才能获取 target 数据?也许您的查询可以(显着?)简化。