select rq,(如果这里写上xm,max(n)就没效果),max(n) from (select rq,(select xm from ryb r,jkjl j where r.gh=j.gh)xm,max(n) from (select extract(year from rq) rq ,r.xm,
(sum(case when fx=0 then je else 0 end)-sum(case when fx=1 then je else 0 end)) n 
from jkjl j,ryb r where j.gh=r.gh group by r.xm,extract(year from rq))group by rq)group by rq题目是:查询每年累计金额(累计金额=收款- 付款)最多的人,生成如下结果的报表:(5分)
年 姓名 累计金额
2006 张先生 2750.25
2007 王小姐 10.00 或者还有其他好办法吗sql

解决方案 »

  1.   

      rq =日期 xm=姓名 sum括号里的是累计金额   累计金额=(收入金额 - 付出金额) 统计每年累计金额最高的人
      

  2.   

     里面出现几个表 就介绍了三个字段? 大概方式这样select rq,xm,
           sum(decode(fx,0,je,0)-decode(fx,1,je,0)) n
    from ..
    group by rq,xm
      

  3.   

    MAX啊 MAX  SUM 外面还要套MAX  他是要最高累计金额的  问题就在函数不能再嵌套函数
      

  4.   


    补充下  意思是要查出 这样的 select rq,xm,max(sum(累计收款金额)-sum(付出累计金额))
    from jkjl  group by rq,xm   
    max()里面已经有sum了不能嵌套了 吧他作为结果集再加MAX效果还是一样
      

  5.   

    extract(year from rq))  是必须的 因为他要的是每年 按年份来的   直接group by rq  不行了
      

  6.   

    外面再嵌套呢
    select to_char(rq,'yyyy') rq,xm,n
    from
    (
    select rq,xm,n,row_number() over(partiton by to_char(rq,'yyyy') order by n desc) rn
    from
    (
    select rq,xm,
           sum(decode(fx,0,je,0)-decode(fx,1,je,0)) n
    from jkjl 
    group by rq,xm
    )
    )
    where rn = 1
    order by to_char(rq,'yyyy')
      

  7.   


    感谢大神 结果出来了 另外over里面貌似那个单词打错了。。  难怪运行老是错。。  
    就是不明白的是 over是什么意思  为什么rn=1 就 把最高金额的筛选出来了
      

  8.   


    失误失误了、 纯手工回复的 难免几个打错..over 开窗函数 在oracle里面经常会用到 功能非常强大 LZ可以百度研究下 最里面一层 是求每个人每天累计金额
    中间一层是根据年份分组 按累计金额倒排序  rn就是排名金额最高排第一
    最外面一层 就是取所有排名第一的数据 也就是每年排第一的人和金额
      

  9.   


    失误失误了、 纯手工回复的 难免几个打错..over 开窗函数 在oracle里面经常会用到 功能非常强大 LZ可以百度研究下 最里面一层 是求每个人每天累计金额
    中间一层是根据年份分组 按累计金额倒排序  rn就是排名金额最高排第一
    最外面一层 就是取所有排名第一的数据 也就是每年排第一的人和金额谢谢了  虽然rn=1 的原理还没搞懂, 下次再仔细研究研究