MSSQL中的超难问题(不用存储过程实现列行转换)高分求解!!!
举例说明:
现有表TABLE1
字段1 字段2
aaa xxx
aaa yyy
aaa zzz
bbb ppp
ccc qqq
ccc ooo
要实现下面的结果 如果使用SQL语句
字段1 字段2
aaa xxx,yyy,zzz
bbb ppp
ccc qqq,ooo
PS:存储过程实现我已经会了,请高手只用SQL语句实现,谢谢~~ 注意:环境是SQL SERVER2000
补充:我想说明的是 , 不使用存储过程,语句越精简越好~~~ 谢谢~
答案:--建立数据表
create table table_1 (c1 varchar(50), c2 varchar(50))
insert into table_1
select 'aaa' ,'xxx'
union select 'aaa' ,'yyy'
union select 'aaa' ,'zzz'
union select 'bbb' ,'ppp'
union select 'ccc' ,'qqq'
union select 'ccc' ,'ooo'
select * from table_1
--执行查询
declare @c1 varchar(50)
declare @c2 varchar(50)
declare @a1 varchar(50)
declare @a2 varchar(50)
DECLARE f_Cursor CURSOR FOR SELECT c1, c2 FROM table_1 order by c1,c2
create table #table (a1 varchar(50),a2 varchar(50))
OPEN f_Cursor
set @a2 = ''
FETCH NEXT FROM f_Cursor into @c1,@c2
set @a1=@c1
WHILE @@FETCH_STATUS = 0
BEGIN
if @a1=@c1
begin
if @a2=''
set @a2=@c2
else
set @a2=@a2 + ',' +@c2
end
else
begin
insert into #table (a1,a2) values (@a1,@a2)
set @a1=@c1
set @a2=@c2
end
FETCH NEXT FROM f_Cursor into @c1,@c2
END
insert into #table (a1,a2) values (@a1,@a2)
CLOSE f_Cursor
DEALLOCATE f_Cursor
select * from #table
drop table #table
--清除数据表
drop table table_1
--=======================
这没用存储过程嘛,字符串连接还要加逗号,你这要求不用游标来循环还真没办法做,
其他:楼主,你很强!!!!!! 分很高,但也懒着一行行写代码了。不用存储过程当然能实现!
楼上的用游标是肯定的,但是没必要创建临时表。我说下过程,你可以自己试:
1、根据字段一排序查询生成游标
2、从游标种取记录,记录字段1的值为最近一次记录的字段1的值,
3、显示字段一值
4、从游标种取下一记录,如果当前字段1值与上一字段一值一样,则在同一行拼字段二的值(中间用逗号隔开),否则另起一行显示字段一值 字符串拼接肯定要用到变量,而select中只能对变量赋单个值,所以单一的sql应该是无法完成这样的功能。只能创建临时表,在表中增加自增列,然后用update语句来拼。
这样倒是可以不用游标。
上一个:asp.net+mssql和php+linux+mysql谁更快?
下一个:MSSQL varchar 类型 长度 怎么算