国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL Server 中 自定義函數(shù) 和 游標(biāo) 應(yīng)用的經(jīng)典案例

2024-08-31 00:48:02
字體:
供稿:網(wǎng)友
    這是網(wǎng)友的問題,我當(dāng)時立馬給出了自己的解決方案,但是沒有想到中間有點小問題,發(fā)現(xiàn)后經(jīng)過自己仔細(xì)調(diào)試,完全得到正確結(jié)果后,那個網(wǎng)友已經(jīng)結(jié)帖了。我的代碼遂成為雞肋,食之無味,棄之可惜。但是我覺得我的代碼確實還是挺經(jīng)典的,所以整理了一下,供各位網(wǎng)友欣賞。問題:
 

假設(shè)環(huán)境如下:

    表1:      id, name,      qq,     phone,

表中數(shù)據(jù):      1       秦云        10102800 13500000

                2       在路上      10378    13600000

                3       leo         10000    13900000

 

    表2:      id, name,  上機(jī)時間,管理員,

表中數(shù)據(jù):     1   秦云    2004-1-1  李大偉

               2   秦云    2005-1-1  馬化騰

               3    在路上  2005-1-1  馬化騰

               4    秦云   2005-1-1  李大偉

               5   在路上 2005-1-1  李大偉

 

實現(xiàn)目的:從表1中取所有人員列表,從表2中取上機(jī)次數(shù)和管理員.

             上機(jī)人員名單    上機(jī)次數(shù)   管理員(上這幾次機(jī)的每個管理員都列出來)

               秦云             3             李大偉,馬化騰,李大偉

               在路上           2            馬化騰,李大偉

               leo              0      

如果不算管理員那一列的話,我是這樣寫的。

select  表1.name as 姓名, count(表2.id) as 上機(jī)次數(shù)

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) ,

上機(jī)時間  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 上機(jī)次數(shù), dbo.getnamestr(表2.name) as 管理員

from 表2

where 表2.name in ( select 表1.name from 表1 )

group by 表2.name

 

 

測試結(jié)果:

 

姓名    上機(jī)次數(shù)    管理員

--------------------------------------------------------------

秦云        3       李大偉,馬化騰,李大偉

在路上      2       馬化騰,李大偉

 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴隆县| 青阳县| 昔阳县| 汉寿县| 江西省| 茶陵县| 宿松县| 手机| 平舆县| 宝应县| 奎屯市| 富蕴县| 余江县| 达尔| 舒城县| 陇西县| 黑龙江省| 玉屏| 建阳市| 安新县| 乌兰县| 璧山县| 隆昌县| 乐昌市| 南昌市| 离岛区| 小金县| 邢台市| 陆丰市| 和田市| 子洲县| 静安区| 安宁市| 建始县| 安陆市| 运城市| 洮南市| 清徐县| 潮州市| 桃园县| 大港区|