当前位置:数据库 > SQLServer >>

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 类型 长度 怎么算

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,