这是网友的问题,我当时立马给出了自己的解决方案,但是没有想到中间有点小问题,发现后经过自己仔细调试,完全得到正确结果后,那个网友已经结帖了。我的代码遂成为鸡肋,食之无味,弃之可惜。但是我觉得我的代码确实还是挺经典的,所以整理了一下,供各位网友欣赏。问题:
假设环境如下:
表1: id, name, qq, phone,
表中数据: 1 秦云 10102800 13500000
2 在路上 10378 13600000
3 leo 10000 13900000
表2: id, name, 上机时间,管理员,
表中数据: 1 秦云 2004-1-1 李大伟
2 秦云 2005-1-1 马化腾
3 在路上 2005-1-1 马化腾
4 秦云 2005-1-1 李大伟
5 在路上 2005-1-1 李大伟
实现目的:从表1中取所有人员列表,从表2中取上机次数和管理员.
上机人员名单 上机次数 管理员(上这几次机的每个管理员都列出来)
秦云 3 李大伟,马化腾,李大伟
在路上 2 马化腾,李大伟
leo 0
如果不算管理员那一列的话,我是这样写的。
select 表1.name as 姓名, count(表2.id) as 上机次数
from 表1 left outer join
表2 on 表1.name = 表2.name
group by 表1.名称
解答:
测试用例
create table 表1( –drop table 表1
id int,
name varchar(10),
qq varchar(10),
phone varchar(20)
)
insert into 表1 values(1 ,秦云 ,10102800 ,13500000)
insert into 表1 values(2 ,在路上 ,10378 ,13600000)
insert into 表1 values(3 ,leo ,10000 ,13900000)
create table 表2( –drop table 表2
id int,
name varchar(10) ,
上机时间 datetime,
管理员 varchar(10)
)
insert into 表2 values(1,秦云 ,cast(2004-1-1 as datetime),李大伟)
insert into 表2 values(2,秦云 ,cast(2005-1-1 as datetime),马化腾)
insert into 表2 values (3,在路上 ,cast(2005-1-1 as datetime),马化腾)
insert into 表2 values(4,秦云 ,cast(2005-1-1 as datetime),李大伟)
insert into 表2 values(5,在路上 ,cast(2005-1-1 as datetime),李大伟)
程序部分
create function getnamestr(@name nvarchar(10))
returns nvarchar(800)
as
begin
declare @namestr nvarchar(800)
declare @tempstr nvarchar(800)
declare @flag int
declare mycur cursor for ( select 管理员 from 表2 where 表2.name = @name )
open mycur
fetch next from mycur into @tempstr
set @flag = 0
while @@fetch_status = 0
begin
if @flag = 0
begin
set @namestr = @tempstr
end
else
begin
set @namestr = @namestr + , + @tempstr
end
set @flag = @flag + 1
fetch next from mycur into @tempstr
end
close mycur
deallocate mycur
return @namestr
end
select 表2.name as 姓名, count(id) as 上机次数, dbo.getnamestr(表2.name) as 管理员
from 表2
where 表2.name in ( select 表1.name from 表1 )
group by 表2.name
测试结果:
姓名 上机次数 管理员
————————————————————–
秦云 3 李大伟,马化腾,李大伟
在路上 2 马化腾,李大伟
