这样的问题我也遇到过,在SQL SERVER中没有找到这样统计的方法,最后只好间接得到 SELECT (SELECT COUNT(*) FROM TABLE WHERE 用户类别='管理员' AND ...) AS 管理员, (SELECT COUNT(*) FROM TABLE WHERE 用户类别='普通管理员' AND ...) AS 普通管理员, (SELECT COUNT(*) FROM TABLE WHERE 用户类别='一般用户' AND ...) AS 一般用户也在学习中,希望有好的方法
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)
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)
--测试环境 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 #
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
--测试环境 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 1 2 我的结果 有点问题字段之间没有连接好 而是重叠了 怎么回事??
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)
select 用户类别,count(*) as cnt from tbl where 注册时间>=20050501 and 注册时间<=20050620 group by 用户类别 最近做的项目是Sybase的,好久没有用sql了 你试试,如果不行,再发贴子说
SELECT
(SELECT COUNT(*) FROM TABLE WHERE 用户类别='管理员' AND ...) AS 管理员,
(SELECT COUNT(*) FROM TABLE WHERE 用户类别='普通管理员' AND ...) AS 普通管理员,
(SELECT COUNT(*) FROM TABLE WHERE 用户类别='一般用户' AND ...) AS 一般用户也在学习中,希望有好的方法
( 用户类别 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)
普通管理员=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)
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 #
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
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
1
2
我的结果 有点问题字段之间没有连接好 而是重叠了 怎么回事??
sum(case when 用户类别='普通管理员' then 1 else 0 end) as 普通管理员,
sum(case when 用户类别='一般用户' then 1 else 0 end) as 一般用户
from tableName where (注册时间>=20050501 and 注册时间<=20050620)
from tbl
where 注册时间>=20050501 and 注册时间<=20050620
group by 用户类别
最近做的项目是Sybase的,好久没有用sql了
你试试,如果不行,再发贴子说
这个sum和case的搭配真是绝了,羡慕&惭愧阿!
大哥们的意思~