关于表转换的存储过程
怎样把表
201 2
202 2
301 3
302 3
401 4
402 4
改成
2 201,202
3 301,302
4 401,402
201,202放在一个字段里
急,谢谢!
问题点数:100、回复次数:12Top
1 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:22:27 得分 0
create function c_str(@col1)
returns varchar(1000)
as
begin
declare @s varchar(1000)
set @s=''
select @s=@s+','+col1 from 表 where col2=@col2
return stuff(@s,1,1,'')
end
--查询
select col2,dbo.c_str(col2) from 表 group by col1Top
2 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:25:48 得分 0
如果每组只有2个数据,就这样
select a.id,a.col1+','+b.col1
from 表 a inner join 表 b on a.col2=b.col2
and a.col1=(select top 1 col1 from 表 where col2=a.col2)
and a.col1<>b.col1
Top
3 楼LBYYBL(o_o)回复于 2005-01-12 15:30:02 得分 0
--创建合并函数
create function testfun(@id varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+cast(a as nvarchar(10)) from t where b=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go
--创建表,并输入测试数据
create table t(a int,b int)
insert into t select 201, 2
insert into t select 202, 2
insert into t select 301, 3
insert into t select 302, 3
insert into t select 401, 4
insert into t select 402, 4
--sql语句
select distinct b ,dbo.testfun(b) as a from t
--删除测试表
drop table t
--删除合并函数
drop function testfun
Top
4 楼zjcxc(邹建)回复于 2005-01-12 15:30:24 得分 0
--如果每组只有两个数据,可以用
select 字段b,生成的字段=rtrim(min(字段a))+','+rtrim(max(字段a))
from 表 group by 字段b
--如果生成的结果是三列
select 字段b,min(字段a),max(字段a)
from 表 group by 字段bTop
5 楼zjcxc(邹建)回复于 2005-01-12 15:30:39 得分 0
--如果每组只有两个数据,可以用
select 字段b,生成的字段=rtrim(min(字段a))+','+rtrim(max(字段a))
from 表 group by 字段b
Top
6 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:32:04 得分 0
改一点
create function c_str(@col2)
returns varchar(1000)
as
begin
declare @s varchar(1000)
set @s=''
select @s=@s+','+col1 from 表 where col2=@col2
return stuff(@s,1,1,'')
end
--查询
select col2,dbo.c_str(col2) from 表 group by col2
Top
7 楼lsxaa(小李铅笔刀)回复于 2005-01-12 15:32:49 得分 0
zjcxc(邹建)
--如果每组只有两个数据,可以用
select 字段b,生成的字段=rtrim(min(字段a))+','+rtrim(max(字段a))
from 表 group by 字段b
这个好
Top
8 楼luoye2002(落叶2002)回复于 2005-01-12 16:09:20 得分 0
to lbyybl:我 的 这个表也是 也是通过select出来的,a是通过函数出来的语句如下(select room.roomno+','+ dbo.nulltoO(room.cleanstatus,room.inroomflag)+':' 房间状态,room.level from room
left join (select status,roomno,hotelcode from roomoccupy
where status not in ('C')
group by roomno,hotelcode,status) Occ
on Room.roomno=Occ.roomno
where guestroomid=1 order by room.roomno )
请问怎么套用你 的 函数?谢谢!Top
9 楼zjcxc(邹建)回复于 2005-01-12 16:23:28 得分 100
--那就用临时表
select cast(
room.roomno
+','+dbo.nulltoO(room.cleanstatus,room.inroomflag)
+':' as varchar(8000)) 房间状态
,room.level
into #t from room
left join (select status,roomno,hotelcode from roomoccupy
where status not in ('C')
group by roomno,hotelcode,status
) Occ on Room.roomno=Occ.roomno
where guestroomid=1 order by room.roomno
declare @level int,@r varchar(8000)
update #t set @r=case when @level=level then @r+','+房间状态 else 房间状态 end
,房间状态=@r,@level=level
select 房间状态=max(房间状态),level from #t group by level
select * from #t
drop table #tTop
10 楼luoye2002(落叶2002)回复于 2005-01-12 17:23:42 得分 0
谢谢各位!to zjcxc:能不能解释一下update #t set @r=case when @level=level then @r+','+房间状态 else 房间状态 end
,房间状态=@r,@level=level,谢谢!Top
11 楼zjcxc(邹建)回复于 2005-01-12 19:53:26 得分 0
你把它理解成游标,逐条处理就行了Top
12 楼luoye2002(落叶2002)回复于 2005-01-14 13:42:27 得分 0
select 房间状态=max(房间状态),level from #j group by level
什么 意思?Top




