首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

在存储过程中的语句(急),该怎么处理

2012-01-18 
在存储过程中的语句(急)想实现的查询例如:一个表a_t数据为idnamexuelistartdateenddatenote1张明大学1999-

在存储过程中的语句(急)
想实现的查询例如

一个表a_t   数据为
id     name     xueli   startdate     enddate             note
1       张明     大学     1999-09-01   2003-07-01       本科
2       张明     硕士     2003-09-01   2005-07-01       硕士
3       王树     大学     2001-09-01   2005-07-01       本科
4       李欢     大学     2000-09-01   2003-07-01       专科

实现:插到另一个表b_t
id     name               xljg                               start_end_date  
1       张明         大学;硕士           1999-09-01;2003-07-01;2003-09-01;2005-07-01
2       王树         大学                       2003-09-01;2005-07-01
3       李欢         大学                       2000-09-01;2003-07-01

当a_t表中   name相同那么   学历相加用‘;’分开,startdate和enddate相加按前后上下相加用‘;’分开

startdate为日期型
enddate为日期型
start_end_date为字符型


[解决办法]
--环境
create table a_t
(
id int,
name varchar(10),
xueli varchar(10),
startdate datetime,
enddate datetime,
note varchar(10)
)

insert into a_t select 1, '张明 ', '大学 ', '1999-09-01 ', '2003-07-01 ', '本科 '
insert into a_t select 2, '张明 ', '硕士 ', '2003-09-01 ', '2005-07-01 ', '硕士 '
insert into a_t select 3, '王树 ', '大学 ', '2001-09-01 ', '2005-07-01 ', '本科 '
insert into a_t select 4, '李欢 ', '大学 ', '2000-09-01 ', '2003-07-01 ', '专科 '

go

--创建用户定义函数连接日期
create function f_datestr(@name varchar(100))
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ' '
select @ret = @ret+ '; '+convert(varchar(10),startdate,120)+ '; '+convert(varchar(10),enddate,120) from a_t where name = @name
set @ret = stuff(@ret,1,1, ' ')
return @ret
end
go

--创建用户定义函数连接学历
create function f_xlstr(@name varchar(100))
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ' '
select @ret = @ret+ '; '+xueli from a_t where name = @name
set @ret = stuff(@ret,1,1, ' ')
return @ret
end
go

--插入数据
select identity(int,1,1) as id, name,dbo.f_xlstr(name) as xljg,dbo.f_datestr(name) as start_end_date
into b_t
from a_t
group by name

--查询
select * from b_t
--结果
1李欢大学2000-09-01;2003-07-01
2王树大学2001-09-01;2005-07-01
3张明大学;硕士1999-09-01;2003-07-01;2003-09-01;2005-07-01

--删除环境
drop function f_datestr
drop function f_xlstr

[解决办法]
-- Step 1 建立测试数据=======================================================
-- create table a_t([id] int,[name] varchar(10),xueli varchar(10),startdate datetime,enddate datetime,note varchar(10))


--
--
-- insert a_t
-- select 1, '张明 ', '大学 ', '1999-09-01 ', '2003-07-01 ', '本科 '
-- union all
-- select 2, '张明 ', '硕士 ', '2003-09-01 ', '2005-07-01 ', '硕士 '
-- union all
-- select 3, '王树 ', '大学 ', '2001-09-01 ', '2005-07-01 ', '本科 '
-- union all
-- select 4, '李欢 ', '大学 ', '2000-09-01 ', '2003-07-01 ', '专科 '

--Step 2 建立自定义函数=========================================================
--
-- ALTER FUNCTION dbo.f_str(@name varchar(10),@flag bit)
-- RETURNS varchar(100)
-- AS
-- BEGIN
-- DECLARE @re varchar(100)
-- SET @re= ' '
--
-- if @flag = 0
-- begin
-- SELECT @re=@re+ '; '+xueli
-- FROM a_t
-- WHERE [name]=@name
-- end
-- else
-- begin
-- SELECT @re=@re+ '; '+ convert(varchar(10),startdate,120) + '; ' + convert(varchar(10),enddate,120)
-- FROM a_t
-- WHERE [name]=@name
-- end
-- RETURN(STUFF(@re,1,1, ' '))
-- END

-- Step 3 运行语句=====================================
select [name],dbo.f_str([name],0),dbo.f_str([name],1) from a_t
group by [name]

热点排行