加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

SQL Server 中 自界说函数 和 游标 应用的经典案例

发布时间:2018-08-17 12:50:50 所属栏目:电商 来源:站长网
导读:这是网友的题目,我其时立马给出了本身的办理方案,可是没有想到中间有点小题目,发明后颠末本身细心调试,完全获得正确功效后,谁人网友已经结帖了。我的代码遂成为鸡肋,食之无味,弃之痛惜。可是我认为我的代码确拭魅照旧挺经典的,以是清算了一下,供列位
    这是网友的题目,我其时立马给出了本身的办理方案,可是没有想到中间有点小题目,发明后颠末本身细心调试,完全获得正确功效后,谁人网友已经结帖了。我的代码遂成为鸡肋,食之无味,弃之痛惜。可是我认为我的代码确拭魅照旧挺经典的,以是清算了一下,供列位网友浏览。题目:
 

假设情形如下:

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

 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读