在存储过程中的语句(急)

sun_power 2007-01-12 04:01:31
想实现的查询例如

一个表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为字符型
...全文
254 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
窝抓了个羊 2007-01-14
  • 打赏
  • 举报
回复
to:coolingpipe(冷箫轻笛)
有NULL的时候好像有问题~
hillhx 2007-01-13
  • 打赏
  • 举报
回复
没明白,你这不是一个....连接的问题么?为什么说是存储过程啊?

日期我就不写了,如果你IO开销不大,用SQL实现就好了

select isnull(a.name,b.name),
case when a.xeli is no null and b.xueli is not null then a.xueli+';'+b.xueli
else isnull(a.xueli,'')+isnull(b.xueli,'') end

from a_t a full join b_t b on a.name = b.name
hwq_164 2007-01-13
  • 打赏
  • 举报
回复
abc_sk 2007-01-13
  • 打赏
  • 举报
回复
,,,
shaohan88 2007-01-12
  • 打赏
  • 举报
回复
有点郁闷...
ly5597025 2007-01-12
  • 打赏
  • 举报
回复
sun_power 2007-01-12
  • 打赏
  • 举报
回复
谢谢两位,我在放到存储过程中试试!谢谢
sun_power 2007-01-12
  • 打赏
  • 举报
回复
viptiger(六嘎)
为什么?提示

服务器: 消息 208,级别 16,状态 6,过程 f_str,行 20
对象名 'dbo.f_str' 无效。
viptiger 2007-01-12
  • 打赏
  • 举报
回复
-- 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]
sun_power 2007-01-12
  • 打赏
  • 举报
回复
谢谢,我的有两个列需要相加,您能按我给的这个,相同行的需要相加,能不能按我给的例子
做一个出来
冷箫轻笛 2007-01-12
  • 打赏
  • 举报
回复
--环境
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
viptiger 2007-01-12
  • 打赏
  • 举报
回复
-- 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', '专科'

--
-- 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
select [name],dbo.f_str([name],0),dbo.f_str([name],1) from a_t
group by [name]

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

--结果

name
---------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
李欢 大学 2000-09-01;2003-07-01
王树 大学 2001-09-01;2005-07-01
张明 大学;硕士 1999-09-01;2003-07-01;2003-09-01;2005-07-01

(所影响的行数为 3 行)

冷箫轻笛 2007-01-12
  • 打赏
  • 举报
回复
--参考

字符串汇总问题,在SQL Server 2000下受推荐的方式为:用户定义函数。具体处理方法及实现请参考:
---------------------------------------------------------------------------------------
--生成测试数据
create table 表(部门 int,人员 varchar(20))
insert into 表 select 1,'张三'
insert into 表 select 1,'李四'
insert into 表 select 1,'王五'
insert into 表 select 2,'赵六'
insert into 表 select 2,'邓七'
insert into 表 select 2,'刘八'
go

--创建用户定义函数
create function f_str(@department int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+人员 from 表 where 部门 = @department
set @ret = stuff(@ret,1,1,'')
return @ret
end
go


--执行
select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门
go

--输出结果
/*
部门 人员
---- --------------
1 张三,李四,王五
2 赵六,邓七,刘八
*/


--删除测试数据
drop function f_str
drop table 表
go

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧