表如下:     单位   级别   姓名
     单位A  处级   张三
     单位B  处级   李四
     单位A  科级   王五
     单位B  科级   小六现在要统计各单位各级别分别多少人,以及各单位,或者各级别总共多少人,需要统计如下:
       处级   科级    总计
单位A    1人   1人    2人
单位B    1人   1人    2人
总计      2人   2人    4人
能用一个SQL语句实现吗?
有什么好的解决办法?

解决方案 »

  1.   

    select 单位,
     处级= sum(case when 级别 = '处级' then 1 else 0 end),
     科级= sum(case when 级别 = '科级' then 1 else 0 end),
     总计= sum(1)
    from table
    group by 单位
      

  2.   

    declare @t table(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
    insert @t select  
              '单位A','处级','张三' union select 
              '单位B','处级','李四' union select  
              '单位A','科级','王五' union select  
              '单位B','科级','小六'select isnull(单位,'总计') 单位,
     处级= sum(case when 级别 = '处级' then 1 else 0 end),
     科级= sum(case when 级别 = '科级' then 1 else 0 end),
     总计= sum(1)
    from @t
    group by 单位 with rollup/*
    单位         处级          科级          总计          
    ---------- ----------- ----------- ----------- 
    单位A        1           1           2
    单位B        1           1           2
    总计         2           2           4(所影响的行数为 3 行)
    */
      

  3.   

    declare @t table(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
    insert @t select  
              '单位A','处级','张三' union select 
              '单位B','处级','李四' union select  
              '单位A','科级','王五' union select  
              '单位B','科级','小六'select isnull(单位,'总计') 单位,
     处级= cast(sum(case when 级别 = '处级' then 1 else 0 end) as varchar)+ '人',
     科级= cast(sum(case when 级别 = '科级' then 1 else 0 end) as varchar)+ '人',
     总计= cast(sum(1) as varchar)+ '人'
    from @t
    group by 单位 with rollup/*
    单位         处级                               科级                               总计                               
    ---------- -------------------------------- -------------------------------- -------------------------------- 
    单位A        1人                               1人                               2人
    单位B        1人                               1人                               2人
    总计         2人                               2人                               4人(所影响的行数为 3 行)
    */
      

  4.   

    试:
    declare @sql varchar(8000)
    select @sql=isnull(@sql+',','')+'sum(case when 级别='''+级别+''' then 1 else 0 end) as ['+级别+']'
    from (select distinct 级别 from tb)t
    exec('select isnull(单位,''总计'') as 单位,'+@sql+',总计=sum(1) 
    from tb group by 单位 with rollup 或 cube)
      

  5.   

    create table ta(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
    insert ta select  
              '单位A','处级','张三' union select 
              '单位B','处级','李四' union select  
              '单位A','科级','王五' union select  
              '单位B','科级','小六'declare @sql varchar(8000)
    select @sql=isnull(@sql+',','')+'['+级别+']=cast(sum(case when 级别='''+级别+''' then 1 else 0 end) as varchar)+ ''人'''
    from (select distinct 级别 from ta)t
    exec('select isnull(单位,''总计'') as 单位,'+@sql+',总计=cast(sum(1) as varchar)+''人'' 
    from ta group by 单位 with rollup')/*
    单位         处级                               科级                               总计                               
    ---------- -------------------------------- -------------------------------- -------------------------------- 
    单位A        1人                               1人                               2人
    单位B        1人                               1人                               2人
    总计         2人                               2人                               4人(所影响的行数为 3 行)
    */drop table ta
      

  6.   

    楼主:你的级别是固定的吗,如果不是,则动态生成语句,在执行,代码如下:if object_id('tb') is not null
       drop table tb
    go
    create table tb(单位 varchar(10),级别 varchar(10),姓名 varchar(10))
    insert tb 
    select '单位A','处级','张三' union 
    select '单位B','处级','李四' union 
    select '单位A','科级','王五' union 
    select '单位B','科级','小六'
    --select * from tb
    declare @sql varchar(2000)
    set @sql='select isnull(单位,''总计'') as 单位 ,'
    select @sql=@sql+'(cast((sum(case when 级别='''+a.级别+''' then 1 else 0 end) ) as varchar(10))'+'+'+'''人'''+' ) as '+a.级别+','
    from
    (select distinct 级别 from tb) a
    set @sql=@sql+'(cast(('
    select @sql=@sql+'sum(case when 级别='''+a.级别+''' then 1 else 0 end)+'
    from
    (select distinct 级别 from tb) a
    set @sql=substring(@sql,1,len(@sql)-1)+') as varchar(100))+''人'') as 总计 from tb group by 单位 with rollup'
    exec (@sql)
    接分了啊
      

  7.   

    看的不是很明白,SQL这块不是很熟,能给个注释吗?谢谢