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

求一个简单的分类汇总的SQL语句或存储过程
原表如下:
日期 类别 人员 级别
2013-1-2 A 张三 A
2013-1-3 A 李四 B
2013-1-5 B 李五 B
2013-1-5 C 刘二 C
2013-1-6 C 顾一 A

要求得到如下统计表
统计年份,统计月数,总人数,A类总人数,A类中级别为A的人数,A类中级别为B的人数,B类总人数,C类总人数
2013, 1,  5, 2, 1,1,1,2

求SQL语句,谢谢 

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

create table sp
(日期 date, 类别 varchar(5), 人员 varchar(10), 级别 varchar(5))

insert into sp
 select '2013-1-2', 'A', '张三', 'A' union all
 select '2013-1-3', 'A', '李四', 'B' union all
 select '2013-1-5', 'B', '李五', 'B' union all
 select '2013-1-5', 'C', '刘二', 'C' union all
 select '2013-1-6', 'C', '顾一', 'A'


select yy '统计年份',
       mm '统计月数',
       count(1) '总人数',
       sum(case 类别 when 'A' then 1 else 0 end) 'A类总人数',
       sum(case when 类别='A' and 级别='A' then 1 else 0 end) 'A类中级别为A的人数',
       sum(case when 类别='A' and 级别='B' then 1 else 0 end) 'A类中级别为B的人数',
       sum(case 类别 when 'B' then 1 else 0 end) 'B类总人数',
       sum(case 类别 when 'C' then 1 else 0 end) 'C类总人数'
from
(select 日期,类别,人员,级别,
        year(日期) 'yy',month(日期) 'mm'
 from sp
) t
group by yy,mm

/*
统计年份        统计月数        总人数         A类总人数       A类中级别为A的人数  A类中级别为B的人数  B类总人数       C类总人数
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
2013        1           5           2           1           1           1           2

(1 row(s) affected)
*/

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

SELECT Year(日期) AS 统计年份, Month(日期) AS 统计月数, 
COUNT(DISTINCT 人员) AS 总人数, SUM(CASE WHEN 类别='A' THEN 1 ELSE 0 END) AS A类总人数, SUM(CASE WHEN 类别='A' AN