关键看用户类别是静态的还是动态变化的,如果是静态的,用case就可以解决;如果是动态的,就用动态sql。

解决方案 »

  1.   

    这样的问题我也遇到过,在SQL SERVER中没有找到这样统计的方法,最后只好间接得到
    SELECT
    (SELECT COUNT(*) FROM TABLE WHERE 用户类别='管理员' AND ...) AS 管理员,
    (SELECT COUNT(*) FROM TABLE WHERE 用户类别='普通管理员' AND ...) AS 普通管理员,
    (SELECT COUNT(*) FROM TABLE WHERE 用户类别='一般用户' AND ...) AS 一般用户也在学习中,希望有好的方法
      

  2.   

    create table A
    (   用户类别 varchar(50),
       注册时间 varchar(50),
       注册地点 varchar(50),
       是否认证 varchar(50)
    )
    insert A
    select '管理员','20050510','城市','是' union
    select '一般用户','20050515','郊区','是' union
    select '普通管理员','20050610','郊区','是' union
    select '一般用户','20050622','城市','是' union
    select '普通管理员','20050620','郊区','是' unionselect sum(case when 用户类别='管理员' then 1 else 0 end) as 管理员,
    sum(case when 用户类别='普通管理员' then 1 else 0 end) as 普通管理员,
    sum(case when 用户类别='一般用户' then 1 else 0 end) as 一般用户
    from A where (注册时间>=20050501 and 注册时间<=20050620)
      

  3.   

    select  管理员=sum(case when 用户类别='管理员' then 1 else 0 end),
            普通管理员=sum(case when 用户类别='普通管理员' then 1 else 0 end),
            一般用户=sum(case when 用户类别='一般用户' then 1 else 0 end)
    from  # where  convert(datetime,注册时间,120) between 
    convert(datetime,'20050501 ',120) and  convert(datetime,'20050620 ',120)
      

  4.   

    --测试环境
    create table #(用户类别 varchar(20),注册时间 varchar(20),注册地点 varchar(10),是否认证 varchar(10))
    insert into # select '管理员','20050510','城市','是'
    union all select '一般用户','20050515','郊区','是'
    union all select '普通管理员','20050610','郊区','是'
    union all select '一般用户','20050622','城市','是'
    union all select '普通管理员','20050620','郊区','是'
    --查询
    select  管理员=sum(case when 用户类别='管理员' then 1 else 0 end),
            普通管理员=sum(case when 用户类别='普通管理员' then 1 else 0 end),
            一般用户=sum(case when 用户类别='一般用户' then 1 else 0 end)
    from  # where  convert(datetime,注册时间,120) between 
    convert(datetime,'20050501 ',120) and  convert(datetime,'20050620 ',120)
    --结果
    管理员         普通管理员       一般用户        
    ----------- ----------- ----------- 
    1           2           1
    --删除环境
    Drop table #
      

  5.   

    create table #(用户类别 varchar(20),注册时间 varchar(20),注册地点 varchar(10),是否认证 varchar(10))
    insert into # select '管理员','20050510','城市','是'
    union all select '一般用户','20050515','郊区','是'
    union all select '普通管理员','20050610','郊区','是'
    union all select '一般用户','20050622','城市','是'
    union all select '普通管理员','20050620','郊区','是'--动态sql,数据借用楼上的
      declare @sql varchar(8000)
      set @sql = 'select '
      select @sql = @sql +'['+ 用户类别 +']=sum(case when 用户类别='''+ 用户类别 +''' and 注册时间 between ''20050501'' and ''20050620'' then 1 else 0 end),' from # group by 用户类别 
      set @sql = left(@sql,len(@sql)-1) +' from #'
      exec(@sql)--结果
    管理员         普通管理员       一般用户        
    ----------- ----------- ----------- 
    1           2           1
      

  6.   

    --测试环境
    create table #(用户类别 varchar(20),注册时间 varchar(20),注册地点 varchar(10),是否认证 varchar(10))
    insert into # select '管理员','20050510','城市','是'
    union all select '一般用户','20050515','郊区','是'
    union all select '普通管理员','20050610','郊区','是'
    union all select '一般用户','20050622','城市','是'
    union all select '普通管理员','20050620','郊区','是'select * from #select count(a.用户类别) as 一般用户 
     from (select * from #  where 用户类别='一般用户') a   where convert(datetime,注册时间,120) between convert(datetime ,'20050501 ',120 ) and convert(datetime,'20050620 ',120)union  all select count( 2) as 管理员 
     from (select * from #  where 用户类别='管理员')b 
    where convert(datetime,注册时间,120) between convert(datetime ,'20050501 ',120 ) and convert(datetime,'20050620 ',120)union  allselect count( 3) as 普通管理员
     from (select * from #  where 用户类别='普通管理员')c
    where convert(datetime,注册时间,120) between convert(datetime ,'20050501 ',120 ) and convert(datetime,'20050620 ',120)
    ----------
       一般用户

    1
    2
    我的结果 有点问题字段之间没有连接好  而是重叠了    怎么回事??
      

  7.   

    select sum(case when 用户类别='管理员' then 1 else 0 end) as 管理员,
    sum(case when 用户类别='普通管理员' then 1 else 0 end) as 普通管理员,
    sum(case when 用户类别='一般用户' then 1 else 0 end) as 一般用户
    from tableName where (注册时间>=20050501 and 注册时间<=20050620)
      

  8.   

    select 用户类别,count(*) as cnt
    from tbl
    where 注册时间>=20050501 and 注册时间<=20050620
    group by 用户类别
    最近做的项目是Sybase的,好久没有用sql了
    你试试,如果不行,再发贴子说
      

  9.   

    真厉害阿!很多人都对了,我给谁分阿?
    这个sum和case的搭配真是绝了,羡慕&惭愧阿!
      

  10.   

    请教一下~在   create table #(用户类别 varchar(20),注册时间 varchar(20),注册地点 varchar(10),是否认证 varchar(10)) 中~在table后加上#是什么意思~小弟才学SQL~不大懂
    大哥们的意思~