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 马化腾,李大伟 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |