日期:2014-05-17  浏览次数:20979 次

求统计问题答案:行列置换升级版
有一个部门表: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则没有查询结果



不知道怎么统计,首先先多谢大家。。。。

------解决方案--------------------

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;


最后传入值的部分没看懂,楼主自己修改吧
------解决方案--------------------
这个用一个sql统计不出来,可以使用存储过程将结果输出到临时表中,然后在检索临时表