|AMNT1 | AMNT2 | Rank
__________________________
| 01 | 05 | rank1
| 05 | 10 | rank2
| 10 | 15 | rank3
___________________________我需要提供输出rank1,rank2,rank3 when值之间的case语句
1 and 5 rank1、5 and 10 rank2等
我有一个金额表,其中包含deptid和amount
需要的输出是deptid amount rank,其中rank需要从rank表中提取
如何编写select查询并将其放到case语句中?
它应该是动态的(我的意思是表值可以改变,但我的case语句应该读取最新的值并提供输出)
发布于 2018-10-24 02:23:51
你不需要case。您可以使用相关子查询:
select (select rt.rank from ranktable rt where a.amount >= rt.amnt1 and a.amount < rt.amnt2) as ranking
from amount a;您也可以以join的身份执行此操作。
发布于 2018-10-24 03:20:02
您是否在寻找下面的case语句:
select * from (select case when input_amt>AMNT1 and input_amt<AMNT2 THEN rank end RANK
from ranktable) rnk
where rnk.RANK is not null发布于 2018-10-26 02:30:57
下面是一个连接版本,其中包含CTE格式的示例数据:
with rankings (amnt1, amnt2, rank) as (
select 1, 5, 'rank1' from dual
union all select 5, 10, 'rank2' from dual
union all select 10, 15, 'rank3' from dual
),
amount (deptid, amount) as (
select 1, 0 from dual
union all select 2, 1 from dual
union all select 3, 4 from dual
union all select 4, 5 from dual
union all select 5, 6 from dual
union all select 6, 9 from dual
union all select 7, 10 from dual
union all select 8, 11 from dual
union all select 9, 15 from dual
union all select 10, 16 from dual
)
-- actual query
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount < r.amnt2;这将得到与戈登的子查询方法相同的结果:
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1 rank1
3 4 rank1
4 5 rank2
5 6 rank2
6 9 rank2
7 10 rank3
8 11 rank3
9 15
10 16 如您所见,使用这些比较条件意味着不存在与15匹配的u1。您可以更改它们:
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount > r.amnt1 and a.amount <= r.amnt2;
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1
3 4 rank1
4 5 rank1
5 6 rank2
6 9 rank2
7 10 rank2
8 11 rank3
9 15 rank3
10 16 但是现在没有1的匹配项。如果您尝试用between的等价物同时获得这两个
select a.deptid, a.amount, r.rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2;
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1 rank1
3 4 rank1
4 5 rank1
4 5 rank2
5 6 rank2
6 9 rank2
7 10 rank2
7 10 rank3
8 11 rank3
9 15 rank3
10 16 由于行重叠,您现在可以获得多个结果。例如,当有多个匹配时,你可以通过保持“更高”的排名来摆脱它们:
select a.deptid, a.amount,
max(r.rank) keep (dense_rank last order by r.amnt1) as rank
from amount a
left join rankings r on a.amount >= r.amnt1 and a.amount <= r.amnt2
group by a.deptid, a.amount;
DEPTID AMOUNT RANK
---------- ---------- -----
1 0
2 1 rank1
3 4 rank1
4 5 rank2
5 6 rank2
6 9 rank2
7 10 rank3
8 11 rank3
9 15 rank3
10 16 但是,实际上,你要么不应该有重叠;要么你需要定义哪个结果是正确的。(如果您的数据总是与某些内容匹配,那么您甚至可能根本不需要/想要一个下限;但这也是一个稍有不同的查询。)
https://stackoverflow.com/questions/52955499
复制相似问题