這是網友的問題,我當時立馬給出了自己的解決方案,但是沒有想到中間有點小問題,發現后經過自己仔細調試,完全得到正確結果后,那個網友已經結帖了。我的代碼遂成為雞肋,食之無味,棄之可惜。但是我覺得我的代碼確實還是挺經典的,所以整理了一下,供各位網友欣賞。
問題:
假設環境如下:
表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 馬化騰,李大偉