原表如下:
日期 类别 人员 级别
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语句,谢谢 

解决方案 »

  1.   


    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)
    */
      

  2.   


    SELECT Year(日期) AS 统计年份, Month(日期) AS 统计月数, 
    COUNT(DISTINCT 人员) AS 总人数, SUM(CASE WHEN 类别='A' THEN 1 ELSE 0 END) AS A类总人数, SUM(CASE WHEN 类别='A' AND 级别 = 'A' THEN 1 ELSE 0 END) AS A类中级别为A的人数, SUM(CASE WHEN 类别='A' AND 级别 = 'B' THEN 1 ELSE 0 END) AS A类中级别为B的人数, SUM(CASE WHEN 类别='B' THEN 1 ELSE 0 END) AS B类总人数, SUM(CASE WHEN 类别='C' THEN 1 ELSE 0 END) AS C类总人数
    FROM 表 
    GROUP BY Year(日期), Month(日期)