假设有一个公司表Company,表结构如下:
--------------------------------------
CompanyCode:公司代码
CompanyName:公司名称
IndustryCode:所在行业代码
IndustryName:所在行业名称
-------------------------------------另外有一个公司销售额表Sale,表结构如下:
---------------------------------------
CompanyCode: 公司代码
Sale:        月度销售额
Date:        月度
---------------------------------------我现在要列出每一个公司在它所在行业的销售额排名,如果该行业有的公司在销售额表找不到,仅列出该公司,不做排名处。怎么写这个SQL语句?例如,结果可能是这样:
----------------------------------------
排名  公司代码    销售额    行业代码
Order CompanyCode Sale      IndustryCode
1     001         19        G001
2     002         15        G001
3     019         13        G001
4     035         8         G001
5     036         -         G001
6     078         -         G001  
1     100         239       A001
2     198         155       A001
3     200         120       A001
4     317         118       A001
5     429         100       A001
6     500         -         A001
7     600         -         A001

解决方案 »

  1.   

    这里的ORACLE SQL 高手都哪里去了?结果的第一列可以不列出,这里只是方便表达我的意思。
      

  2.   

    你要显示的表是月销售额还是该公司所有销售额的统计?汇总统计
    select rwo_number() over(partition by t.IndustryCode order by t.sale ) order,t.CompanyCode,t.sale,t.IndustryCode
    (select a.CompanyCode,decode(s.sale,null,'-',to_char(s.sale)) sale,a.IndustryCode
    from
    Company a,
    (select CompanyCode,sum(sale) sale
    from sale
    group by CompanyCode) s
    where a.CompanyCode=s.CompanyCode(+)) t
    group by t.CompanyCode,t.sale,t.IndustryCode
      

  3.   

    刚刚发现,其实最后不用GROUP BY,直接ORDER BY就行了
    select rwo_number() over(partition by t.IndustryCode order by t.sale ) order,t.CompanyCode,t.sale,t.IndustryCode
    (select a.CompanyCode,decode(s.sale,null,'-',to_char(s.sale)) sale,a.IndustryCode
    from
    Company a,
    (select CompanyCode,sum(sale) sale
    from sale
    group by CompanyCode) s
    where a.CompanyCode=s.CompanyCode(+)) t
    order by t.IndustryCode  deac,order
      

  4.   

    发现漏了个from 
    select rwo_number() over(partition by t.IndustryCode order by t.sale ) order,t.CompanyCode,t.sale,t.IndustryCodefrom(select a.CompanyCode,decode(s.sale,null,'-',to_char(s.sale)) sale,a.IndustryCode
    from
    Company a,
    (select CompanyCode,sum(sale) sale
    from sale
    group by CompanyCode) s
    where a.CompanyCode=s.CompanyCode(+)) torder by t.IndustryCode  deac,order
      

  5.   

    用楼上的方法,解析函数
    ROW_NUMBER() OVER()只是楼上太激动,把ROW_NUMBER()写成RWO_NUMBER()
      

  6.   

    用楼上的方法,解析函数
    ROW_NUMBER() OVER()只是楼上太激动,把ROW_NUMBER()写成RWO_NUMBER()
    ===========================================是啊看到有分可以抢,ROW都写错了
      

  7.   

    select decode(b.sale,null,'',row_number() over (partition by a.INDUSTRYCODE order by b.sale)) orderid,
    a.COMPANYCODE,decode(b.sale,null,'-',to_char(b.sale)) sale,a.INDUSTRYCODE
    from scott.company a left outer join 
    (
    select CompanyCode,sum(sale) sale
    from scott.sale
    group by CompanyCode
    ) b
    on a.COMPANYCODE=b.CompanyCode这样就可以实现无销售记录的公司不做排名了