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


    问题:
     

    假设环境如下:

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

  • 相关阅读:
    centos6.8防火墙模块未加载
    CentOS6.8下安装Redis
    CentOS6.8下安装mysql
    git使用手册
    oracle锁表与解表
    原生js(二)
    原生js(一)
    学习计划调整
    jQuery Sizzle选择器(三)
    jQuery Sizzle选择器(二)
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/2025986.html
Copyright © 2020-2023  润新知