尝试找到编写此SQL语句的最佳方法。
我有一个客户表,其中包含该客户的内部信用评分。然后我有另一张表,其中包含该信用评分的定义。我想将这些表连接在一起,但第二个表没有任何方法可以轻松链接它。
客户的分数是1-999之间的整数,定义表包含以下列:
Score
Description
这些行:
60 LOW
99 MED
999 HIGH
所以基本上如果一个客户得分在1到60之间,他们就是低,61-99他们是医学,100-999他们是高。
我无法真正加入这些内容,因为如果分数为60,99或999,它只会加入它们,这将排除其他人的分数。
我不想用静态数字做一个case语句,因为我们的分数将来可能会改变,而且我不想在/如果有的话更新我的初始查询。我也无法创建任何表或函数来执行此操作 - 我需要创建一个SQL语句来为我完成。
编辑:
一位同事说这会奏效,但有点疯狂。我认为必须有更好的方法:
SELECT
internal_credit_score
(
SELECT
credit_score_short_desc
FROM
cf_internal_credit_score
WHERE
internal_credit_score = (
SELECT
max(credit.internal_credit_score)
FROM
cf_internal_credit_score credit
WHERE
cs.internal_credit_score <= credit.internal_credit_score
AND credit.internal_credit_score <= (
SELECT
min(credit2.internal_credit_score)
FROM
cf_internal_credit_score credit2
WHERE
cs.internal_credit_score <= credit2.internal_credit_score
)
)
)
FROM
customer_statements cs
答案 0 :(得分:3)
试试这个,更改你的表格以包含得分范围:
ScoreTable
-------------
LowScore int
HighScore int
ScoreDescription string
数据值
LowScore HighScore ScoreDescription
-------- --------- ----------------
1 60 Low
61 99 Med
100 999 High
查询:
Select
.... , Score.ScoreDescription
FROM YourTable
INNER JOIN Score ON YourTable.Score>=Score.LowScore
AND YourTable.Score<=Score.HighScore
WHERE ...
答案 1 :(得分:2)
假设您的表名为CreditTable
,这就是您想要的:
select * from
(
select Description, Score
from CreditTable
where Score > 80 /*client's credit*/
order by Score
)
where rownum = 1
此外,请确保您的高分参考值为1000,即使客户的最高分数为999。
<强>更新强>
上面的SQL为您提供给定值的信用记录。如果你想加入,比如Clients
表,你会做这样的事情:
select
c.Name,
c.Score,
(select Description from
(select Description from CreditTable where Score > c.Score order by Score)
where rownum = 1)
from clients c
我知道这是为每个返回行执行的子选择,但是再次,CreditTable
非常小,并且由于子选择的使用,不会有明显的性能损失。
答案 2 :(得分:1)
您可以使用分析函数将得分描述表中的数据转换为范围(我假设您的意思是100-999应该映射到'HIGH',而不是99-999)。
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select 60 score, 'Low' description from dual union all
3 select 99, 'Med' from dual union all
4 select 999, 'High' from dual
5 )
6 select description,
7 nvl(lag(score) over (order by score),0) + 1 low_range,
8 score high_range
9* from x
SQL> /
DESC LOW_RANGE HIGH_RANGE
---- ---------- ----------
Low 1 60
Med 61 99
High 100 999
然后,您可以使用类似
的内容将其加入CUSTOMER
表格
SELECT c.*,
sd.*
FROM customer c,
(select description,
nvl(lag(score) over (order by score),0) + 1 low_range,
score high_range
from score_description) sd
WHERE c.credit_score BETWEEN sd.low_range AND sd.high_range