日期:2014-05-16  浏览次数:20789 次

遇到难题,求高手写一句SQL
现在有2张表,一张表记录了客户信息(客户ID,客户名),另一张表记录了这个客户和发放给他贷款的银行(客户,贷款发放行,贷款额度)。
求列出每个客户对应的提供给该客户最大贷款额度的银行?
比如:

客户表:
1 小明
2 小芳

客户贷款信息
1 100万 农行
1 200万 中国银行
2 150万 建设银行
2 200万 农行


求出的结果应该为
客户ID 客户名 贷款发放额度最大行
1 小明 中国银行
2 小芳 农行


求高手指点,用ORACLE应该怎么写这个SQL啊?

oracle

------解决方案--------------------
引用:
这个问题还有个加强版。

就是如果遇到贷款额度相同的贷款发放行,按照升序取排在最前面的行。

客户表:
客户ID, 客户名
1 小明
2 小芳

客户贷款信息
客户ID, 贷款金额  发贷银行
1 100万 农行
1 200万 中国银行
1 200万 建设银行
2 150万 建设银行
2 200万 农行

有没有高手帮忙看看啊?


这个是典型的,前“N”个查询,按照个人编号进行分组,查询该人的信息,使用常规的SQL来写是比较麻烦的,Oracle在8i以上提供分析函数其目的之一就是为了解决前N个查询的问题。

建立测试数据


/*
CREATE TABLE CUSTOM(
    CUSTOMID NUMBER(20),
    NAME VARCHAR2(40)
)
;
CREATE TABLE LMSG(
    CUSTOMID NUMBER(20),
    CREDIT NUMBER(20),
    BANKNAME VARCHAR2(40)
)
;
INSERT INTO CUSTOM VALUES(1,'小明');
INSERT INTO CUSTOM VALUES(2,'小芳');
INSERT INTO LMSG VALUES(1,100,'农行');
INSERT INTO LMSG VALUES(1,200,'中国银行');
INSERT INTO LMSG VALUES(1,200,'建设银行');
INSERT INTO LMSG VALUES(2,150,'建设银行');
INSERT INTO LMSG VALUES(2,200,'农行');
*/




SELECT  CUSTOMID,NAME,CREDIT,BANKNAME FROM
(SELECT ROW_NUMBER() OVER(PARTITION BY A.CUSTOMID ORDER BY B.CREDIT DESC, BANKNAME) RN,
       A.CUSTOMID,A.NAME,B.CREDIT,B.BANKNAME
  FROM CUSTOM A, LMSG B
 WHERE A.CUSTOMID = B.CUSTOMID) 
 WHERE RN=1;

结果为:
CUSTOMID NAME CREDIT BANKNAME
1 小明 200 建设银行
2 小芳 200 农行