这是网友的问题,我当时立马给出了自己的解决方案,但是没有想到中间有点小问题,发现后经过自己仔细调试,完全得到正确结果后,那个网友已经结帖了。我的代码遂成为鸡肋,食之无味,弃之可惜。但是我觉得我的代码确实还是挺经典的,所以整理了一下,供各位网友欣赏。
问题:
假设环境如下:
表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 马化腾,李大伟
新闻热点
疑难解答