表名:dept  
deptID 部门编码 Varchar(8) √ 
deptName 部门名称 Varchar(24) 
deptType 部门类别0:销售部门1:技术部门2:管理部门 char(1) 表名:person 
personID 工号 Varchar(8) √ 
Name 姓名 Varchar(24) 
deptID 部门编号 Varchar(8) 
Sex 性别0:女1:男 Char(1) 
Age 年龄 int 

表名:salary 

Pk_salary 流水号 Varchar(8) √ 
Ddate 发工资日期 Varchar(24) 
personID 工号 Varchar(8) 
Amount 基本工资 Number(8,2) 
Bonus 奖金 Number(8,2) 表名:overtime 
Pk_overtime 流水号 Varchar(8) √ 
personID 工号 Varchar(8) 
Ddate 加班日期 Varchar(24) 
hTime 加班时间(小时) Int 
Note 备注 Varchar(100) 二、写SQL语句完成要求 7,按月汇总查询各部门最高工资人的工资,结果要求如下: 
月份 部门名称 部门最高工资人姓名 工资 

解决方案 »

  1.   

    select t.month 月份,t.deptname 部门,t.name 部门最高工资人姓名姓名,t.mount 工资, rownum() over (partition by t.month, t.deptname order by t.mount desc) rn 
    from 

    select to_char(c.ddate, 'yyyy-mm-dd) month, 
    a.deptname,b.name,c.amount
    from dept a,person b,salary c 
    where a.deptid=b.dept_id 
    and b.person=c.person) t 
    where rn=1
      

  2.   

    上面语句不行的话,就试试这样
    seletc t1. 月份,t1.部门,t1.部门最高工资人姓名姓名,t1.工资
    from
    (
    select t.month 月份,t.deptname 部门,t.name 部门最高工资人姓名姓名,t.mount 工资, rownum() over (partition by t.month, t.deptname order by t.mount desc) rn 
    from 

    select to_char(c.ddate, 'yyyy-mm-dd) month, 
    a.deptname,b.name,c.amount
    from dept a,person b,salary c 
    where a.deptid=b.dept_id 
    and b.person=c.person) t ) t1
    where t1.rn=1
      

  3.   

    select 
    t.m 月份,
    t.deptname 部门,
    t.pn 部门最高工资人姓名姓名,
    t.a 工资, 
    rownum() over(partition by t.m, t.dn order by t.a desc) rn  
    from  
    (  
    select
    to_char(c.ddate,  'yyyy-mm-dd') m,  
    a.deptname dn,
    b.pname pn,
    c.amount a
    from dept a,person b,salary c  
    where a.deptid=b.deptid 
    and b.personid=c.personid
    ) t  
    where rn=1
    还是rownum()这有错误的,有其它方法吗,rownum() over(partition by t.m, t.dn order by t.a desc) rn  这函数我看不懂,读一不起 打扰你了啊。
      

  4.   

    CSDN有问题,我那句写错了,应该是row_number() over
    这句的意思是根据t.m,t.dn分组,然后按t.a降序排序,然后编号,当月每部门工资最高的人编号为1
      

  5.   

    试试看~~~select *
      from (
            select to_char(s.Ddate,'yyyymm') as salary_months,
                   d.deptName,
                   p.Name,
                   s.Amount+s.Bonus as salarys,
                   row_number() over(partition by to_char(s.Ddate,'yyyymm'),p.deptID order by (s.Amount+s.Bonus) desc) as rn
              from salary s,
                   dept d,
                   person p
             where s.personId = p.personId
               and p.deptID = d.deptID
           )ss
     where rn = 1;
      

  6.   

    select  
    t.m 月份, 
    t.deptname 部门, 
    t.pn 部门最高工资人姓名姓名, 
    t.a 工资,  
    row_number()over(partition by t.m, t.dn order by t.a desc) rn   
    from   
    (   
    select 
    to_char(c.ddate,   'yyyy-mm-dd ') m,   
    a.deptname dn, 
    b.pname pn, 
    c.amount a 
    from dept a,person b,salary c   
    where a.deptid=b.deptid  
    and b.personid=c.personid 
    ) t   
    where rn=1 
    改了下,说什么  rn标识符无效
      

  7.   

    对了oracle10g 可以用row_number()over() 函数吗
      

  8.   

    select t.month 月份,t.deptname 部门,t.name 部门最高工资人姓名姓名,t.mount 工资 
    from 

    select to_char(c.ddate, 'yyyy-mm-dd) month, 
    a.deptname,b.name,c.amount, 
    row_number() over (partition by to_char(c.ddate, 'yyyy-mm-dd), a.deptname order by c.amount desc) rn 
    from dept a,person b,salary c 
    where a.deptid=b.dept_id 
    and b.person=c.person) t 
    where t.rn=1用这个试试,或者就是
    seletc t1. 月份,t1.部门,t1.部门最高工资人姓名姓名,t1.工资 
    from 

    select t.month 月份,t.deptname 部门,t.name 部门最高工资人姓名姓名,t.mount 工资, row_number() over (partition by t.month, t.deptname order by t.mount desc) rn  
    from  
    (  
    select to_char(c.ddate,  'yyyy-mm-dd) month,  
    a.deptname,b.name,c.amount 
    from dept a,person b,salary c  
    where a.deptid=b.dept_id  
    and b.person=c.person) t ) t1 
    where t1.rn=1