服务器 频道

SQL Server中自定义函数和游标应用经典案例

  【IT168 服务器学院】假设环境如下:

    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       马化腾,李大伟

0
相关文章