表名: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,按月汇总查询各部门最高工资人的工资,结果要求如下:
月份 部门名称 部门最高工资人姓名 工资
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,按月汇总查询各部门最高工资人的工资,结果要求如下:
月份 部门名称 部门最高工资人姓名 工资
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
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
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 这函数我看不懂,读一不起 打扰你了啊。
这句的意思是根据t.m,t.dn分组,然后按t.a降序排序,然后编号,当月每部门工资最高的人编号为1
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;
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标识符无效
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