4
回答
一个简单的Oracle统计问题
终于搞明白,存储TCO原来是这样算的>>>   

一个简单的统计:

部门表 dept:

部门ID 部门名称
1 部门A
2 部门B

爱好表 pre:
爱好ID 爱好名称
10 足球
20 篮球

协会表 ass:
协会ID 协会名称
101 篮球协会
102 足球协会

协会职务表 pos:
协会职务ID 职务名称
301 会员
302 会长

员工吧 emp:

工号 所属部门ID 姓名 爱好ID 协会ID 协会职务ID
1 1 张三 10 101 301
2 1 李四 20 101 302

实现效果:
部门 爱好 协会 职务 人数
部门A 足球 篮球协会 会长 1
部门A 足球 篮球协会 会员 1
部门A 足球 足球协会 会长 0
部门A 足球 足球协会 会员 0
部门A 篮球 篮球协会 会长 0
部门A 篮球 篮球协会 会员 0
部门A 篮球 足球协会 会长 0
部门A 篮球 足球协会 会员 0
部门B 足球 篮球协会 会长 0
部门B 足球 篮球协会 会员 0
部门B 足球 足球协会 会长 0
部门B 足球 足球协会 会员 0
部门B 篮球 篮球协会 会长 0
部门B 篮球 篮球协会 会员 0
部门B 篮球 足球协会 会长 0
部门B 篮球 足球协会 会员 0

存储过程代码:

procedure p(
	x_r out sys_refcursor
) as 
begin
	open x_r for 
		with dept as(
			select * from dept --部门
		),
		pre as(
			select * from pre --爱好
		),
		ass as(
			select * from ass --协会
		),
		pos as(
			select * from pos --协会职务
		),
		all_data as(
			select d.*,p.*,a.*,po.*,
				case 
					when 
					 e.deptId = d.id and e.preId = p.id and e.assId = a.id and e.poId = po.id
					then 1
					else 0
				end
			from dept d CROSS JOIN pre p
				CROSS JOIN ass a
				CROSS JOIN pos po
				CROSS JOIN emp e

		)

		--这里怎么写才能实现最后的结果?
end;



举报
VitoHuang
发帖于2年前 4回/173阅
共有4个答案 最后回答: 2年前

说实话真没看明白你写的sql跟你结果有什么关系

你这结果貌似只对用户进行了统计,其他表直接连接查询就好了吧,然后把各个表的ID跟用户表外键关联获取记录数不就行了?

select 部门名称,爱好名称, 协会名称,职务名称,

(select count(1) from emp e where e.deptId = d.id and e.preId = p.id and e.assId = a.id and e.poId = po.id) 人数 from dept d,pre p,ass a,pos po

没有原始数据,不知道对不对

select d.部门名称, pre.爱好名称, ass.协会名称, pos.职务名称, count(*) "人数"
from emp e
join dept d
  on e.所属部门ID = d.部门ID
left join pre
  on e.爱好ID = pre.爱好ID
left join ass
  on e.协会ID = ass.协会ID
left join pos
  on e.协会职务ID = pos.协会职务ID
group by d.部门名称, pre.爱好名称, ass.协会名称, pos.职务名称




select 部门名称, 爱好名称, 协会名称, 职务名称, count(*)
  from dept a
 inner join pre b
    on 1 = 1
 inner join ass c
    on 1 = 1
 inner join pos d
    on 1 = 1
  left join emp e
    on 所属部门ID = a.id
   and 爱好ID = b.id
   and 协会ID = c.id
   and 协会职务ID = d.id
 group by 部门名称, 爱好名称, 协会名称, 职务名称





顶部