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

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

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

2024-08-31 00:49:24
字體:
供稿:網(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ā)表
主站蜘蛛池模板: 镇沅| 荃湾区| 浙江省| 太仆寺旗| 清河县| 定襄县| 海丰县| 都匀市| 鱼台县| 财经| 密山市| 怀化市| 磴口县| 武城县| 邻水| 神池县| 乌拉特后旗| 商都县| 柞水县| 积石山| 海安县| 泰来县| 玉山县| 惠东县| 太谷县| 肥城市| 京山县| 边坝县| 长子县| 定陶县| 东乡县| 宜君县| 历史| 张家川| 乌鲁木齐县| 新源县| 包头市| 沐川县| 山东省| 嵊泗县| 三门县|