求统计问题答案:行列置换升级版

bbb332 2013-11-21 04:51:18
有一个部门表:dept(deptid,deptname,deptpid)
deptid部门主键;
deptname部门名称;
deptpid部门父id;


有一个数据表people(peopleid,deptid,peopletype)
peopleid主键;
deptid部门id;
peopletype人员类型有四种:typeA,typeB,typeC,typeD;


现在想统计每个部门下不同人员类型的总量;

测试数据:
deptid deptname deptpid
1 部门一 0
2 部门二 1
3 部门三 1
4 部门四 1
5 部门五 2
1
-----------------
2 3 4
---
5
peopleid deptid peopletype
1 1 typeA
2 2 typeB
3 3 typeC
4 4 typeD
5 5 typeB
6 2 typeB


想得到结果如:

deptid deptname typeA typeB typeC typeD
1 部门一 1 3 1 1

然后再根据deptid得到如下结果:
deptid deptname typeA typeB typeC typeD
2 部门二 0 3 0 0
3 部门三 0 0 1 0
4 部门四 0 0 0 1

然后再根据传入的deptid得到如下结果(分两种情况):
①如果传入的deptid是2则结果是:
deptid deptname typeA typeB typeC typeD
5 部门五 0 1 0 0
②如果传入的deptid是3则没有查询结果



不知道怎么统计,首先先多谢大家。。。。
...全文
176 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjn1982 2013-11-22
  • 打赏
  • 举报
回复
这个用一个sql统计不出来,可以使用存储过程将结果输出到临时表中,然后在检索临时表
bbb332 2013-11-22
  • 打赏
  • 举报
回复
??
bbb332 2013-11-21
  • 打赏
  • 举报
回复
这个是有上下级关系的,统计部门一的时候的数据要包括他的所有下级部门的
Leon_He2014 2013-11-21
  • 打赏
  • 举报
回复

DROP TABLE dept;
CREATE TABLE dept(deptid NUMBER,deptname nvarchar2(20),deptpid NUMBER);

INSERT INTO dept
select 1 deptid,'部门一' deptname, 0 deptpid from dual
union all select 2,'部门二', 1   from dual
union all select 3,'部门三', 1	 from dual
union all select 4,'部门四', 1	 from dual
union all select 5,'部门五', 2	 from dual;

DROP TABLE people;
CREATE TABLE people(peopleid NUMBER,deptid NUMBER,peopletype NVARCHAR2(20));

INSERT INTO people
select 1 peopleid,1 deptid,'typeA' peopletype from dual
union all select 2,2,'typeB' from dual
union all select 3,3,'typeC' from dual
union all select 4,4,'typeD' from dual
union all select 5,5,'typeB' from dual
union all select 6,2,'typeB' from dual;

COMMIT;

SELECT deptid,deptname
,SUM(NVL(CASE WHEN peopletype='typeA' THEN 1 ELSE 0 END,0)) AS typeA	
,SUM(NVL( CASE WHEN peopletype='typeB' THEN 1 ELSE 0 END,0)) AS typeB
,SUM(NVL( CASE WHEN peopletype='typeC' THEN 1 ELSE 0 END,0)) AS typeC
,SUM(NVL( CASE WHEN peopletype='typeD' THEN 1 ELSE 0 END,0)) AS typeD
FROM
(
SELECT a.deptid,deptname,peopletype,COUNT(*)
FROM dept a
LEFT JOIN people b
ON a.deptid=b.deptid
GROUP BY a.deptid,deptname,peopletype
) t
GROUP BY deptid,deptname
ORDER BY deptid;

最后传入值的部分没看懂,楼主自己修改吧

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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