求大神求sql语句

baiyang8901 2011-10-25 04:57:08
我都要被这个问题搞疯了
我现在有很多表
emp表显示员工信息 需要用emp_id(number),emp_dept(number 外键到dept_id),emp_joindate(date型),emp_enterdate(date),educateon(varchar2(20))
dr表显示部门调动 需要dr_date(date),dr_dept_f(varchar2(20)调动前部门),dr_dept_a(varchar2(20)调动后部门)
el表 显示员工离职 需要el_date(date),el_dept(number 外键dept_id)
dept表显示部门信息 需要dept_id(number),dept_name(varchar2(20))

现在我要查询某月的 部门名称(dept_name) 部门人数 员工入职数(count(emp_joindate)) 员工离职数(count(el_date)) 员工调入数(count(dr_dept_a)) 员工调出数(count(dr_dept_f)) 并统计员工的学历(education)的人数(研究生,本科,大专,高中级以下)

用一个Sql语句写出 包含以上内容 并且只得出列如下
部门名称,部门人数 员工入职数,员工离职数,员工调入数,员工调出数,研究生,本科,大专,高中级以下

求大神解答
...全文
204 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobn_cn 2011-10-26
  • 打赏
  • 举报
回复
类似这样改

select A.dept_name, B.C, C.C
from dept A
left join (select emp_dept,count(1) C from emp where to_char(emp_enterdate,'yyyy-mm') <='2011-10') and to_char(emp_joindate,'yyyy-mm') <='2011-10') group emp_dept) B
on a.dept_id = b.emp_dept
left join (select el_dept,count(1) C from el where To_char(el_date, 'yyyy-mm') = '2011-10' group by el_dept) C
on a.dept_id = c.el_dept
left join (select dr_dept_a,count(1) from dr where To_char(dr_date, 'yyyy-mm') = '2011-10' group by dr_dept_a) D
on a.dept_id = d.dr_dept_a
left join (select dr_dept_f,count(1) from dr where To_char(drt.dr_date, 'yyyy-mm') = '2011-10' group by dr_dept_f) E
on a.dept_id = e.dr_dept_f
baiyang8901 2011-10-26
  • 打赏
  • 举报
回复
额 我真的是新手 不会做啊 根本不懂怎么写
xiaobn_cn 2011-10-26
  • 打赏
  • 举报
回复
那些关于日期的查询条件可以加下那些统计用的子查询中进行数据过滤。
xiaobn_cn 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 baiyang8901 的回复:]
求帮助 求支援!!!
现在的sql语句是
select DISTINCT dept.dept_name , count(emp.emp_joindate), COUNT(emp.emp_enterdate),
count(el.el_date), count(drt.dr_dept_a), count(dr.dr_dept_f)
from dept
LEFT OUTER JOIN emp……
[/Quote]
你这种写法根本性错误,需要参照我在19楼的写法进行改也,也就是先用子查询按科室进行分组统计,然后再和科室表进行外连接。按你这种写法,科室表会和其它表进行交叉(因为是1对多的关系),会得到很多的数据,统计结果也不是你想要得到的值,因为好多值会被重复计算。
xunmengzhi 2011-10-26
  • 打赏
  • 举报
回复
用inner join
xunmengzhi 2011-10-26
  • 打赏
  • 举报
回复
mark大王来也~
cosio 2011-10-26
  • 打赏
  • 举报
回复
直接给出源数据和结果数据!直接写SQL
baiyang8901 2011-10-26
  • 打赏
  • 举报
回复
求帮助 求支援!!!
现在的sql语句是
select DISTINCT dept.dept_name , count(emp.emp_joindate), COUNT(emp.emp_enterdate),
count(el.el_date), count(drt.dr_dept_a), count(dr.dr_dept_f)
from dept
LEFT OUTER JOIN emp
ON dept.dept_id = emp.emp_dept
AND to_char(emp.emp_joindate,'yyyy-mm') <='2011-10'
AND to_char(emp.emp_enterdate,'yyyy-mm') <='2011-10'
LEFT OUTER JOIN el
ON dept.dept_id =el.el_dept
and To_char(el.el_date, 'yyyy-mm') = '2011-10'
LEFT OUTER JOIN dr
ON dept.dept_name = dr.dr_dept_f
and To_char(dr.dr_date, 'yyyy-mm') = '2011-10'
LEFT OUTER JOIN dr drt
ON dept.dept_name = drt.dr_dept_a
and To_char(drt.dr_date, 'yyyy-mm') = '2011-10'
group by dept_name
但是得到的数据都是一样的而且数量非常多 表里12条数据 查到的count值是49
xiaobn_cn 2011-10-26
  • 打赏
  • 举报
回复

select A.dept_name, B.C, C.C
from dept A
left join (select emp_dept,count(1) C from emp group emp_dept) B
on a.dept_id = b.emp_dept
left join (select el_dept,count(1) C from el group by el_dept) C
on a.dept_id = c.el_dept
left join (select dr_dept_a,count(1) from dr group by dr_dept_a) D
on a.dept_id = d.dr_dept_a
left join (select dr_dept_f,count(1) from dr group by dr_dept_f) E
on a.dept_id = e.dr_dept_f

也可以用分析函数来写,不过我觉得还是用外联接的比较容易理解。
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
dr.dr_dept_f 和dr.dr_dept_a 是name 不是id
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
不对 把dr.dr_dept_f之后group之前去掉有数据 但是是错误数据
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
额 没工具
bsh_ly 2011-10-25
  • 打赏
  • 举报
回复
给点测试数据看下。
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
问题应该出在dr.dr_dept_f这里吧 这一行之后去掉有结果
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
额 应该没有吧 没看出来
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
现在应该查出的结果是 dept_name,1,1,0,0,0,0,0,0,0,
bsh_ly 2011-10-25
  • 打赏
  • 举报
回复
关联条件你看下有没有错。 我现在没有环境测试。
bsh_ly 2011-10-25
  • 打赏
  • 举报
回复
是的 。。。
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
额 还是没有数据
baiyang8901 2011-10-25
  • 打赏
  • 举报
回复
都放后面么
加载更多回复(7)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧