现在有2张表,一张表记录了客户信息(客户ID,客户名),另一张表记录了这个客户和发放给他贷款的银行(客户,贷款发放行,贷款额度)。
求列出每个客户对应的提供给该客户最大贷款额度的银行?
比如:客户表:
1 小明
2 小芳客户贷款信息
1 100万 农行
1 200万 中国银行
2 150万 建设银行
2 200万 农行
求出的结果应该为
客户ID 客户名 贷款发放额度最大行
1 小明 中国银行
2 小芳 农行
求高手指点,用ORACLE应该怎么写这个SQL啊?oracle

解决方案 »

  1.   

    select 
    客户表.id,客户表.name,max(贷款发放额度最大行)
    from
    客户贷款信息,客户表
    where 客户表.id=客户贷款信息.id
    group by 客户表.id,客户表.name
      

  2.   

    你这个不对吧。客户表:
    客户ID, 客户名
    1 小明
    2 小芳客户贷款信息
    客户ID, 贷款金额  发贷银行
    1 100万 农行
    1 200万 中国银行
    2 150万 建设银行
    2 200万 农行select 
    客户表.id,客户表.name,max(贷款发放额度最大行)
    from
    客户贷款信息,客户表
    where 客户表.id=客户贷款信息.id
    group by 客户表.id,客户表.name这个的出的结果不对吧
      

  3.   

    这个问题还有个加强版。就是如果遇到贷款额度相同的贷款发放行,按照升序取排在最前面的行。客户表:
    客户ID, 客户名
    1 小明
    2 小芳客户贷款信息
    客户ID, 贷款金额  发贷银行
    1 100万 农行
    1 200万 中国银行
    1 200万 建设银行
    2 150万 建设银行
    2 200万 农行有没有高手帮忙看看啊?
      

  4.   


    这个是典型的,前“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 农行
      

  5.   

    太谢谢了。想了半天都没想出来。昨天还想了个很麻烦的办法。/*
    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 A.CUSTOMID,T0.NAME,MIN(A.BANKNAME)
    FROM
    CUSTOM T0,
    LMSG A,
    (select customid,max(CREDIT) max_credit
    from LMSG
    group by CUSTOMID) B
    WHERE 
      T0.CUSTOMID=A.CUSTOMID
      AND A.CUSTOMID=B.CUSTOMID
      AND A.CREDIT=B.MAX_CREDIT
    GROUP BY A.CUSTOMID,T0.NAME结果
    2 小芳 农行
    1 小明 中国银行
      

  6.   

    太谢谢了,想了半天,最后自己想了个比较麻烦的办法。还是你这个办法好。/*
    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 A.CUSTOMID,T0.NAME,MIN(A.BANKNAME)
    FROM
    CUSTOM T0,
    LMSG A,
    (select customid,max(CREDIT) max_credit
    from LMSG
    group by CUSTOMID) B
    WHERE 
      T0.CUSTOMID=A.CUSTOMID
      AND A.CUSTOMID=B.CUSTOMID
      AND A.CREDIT=B.MAX_CREDIT
    GROUP BY A.CUSTOMID,T0.NAME
    结果是:
    customid name   BANKNAME
    2 小芳 农行
    1 小明 中国银行