日期:2014-05-19  浏览次数:20505 次

求一sql語句,三行變一行
學號   選修課  
07001     语文        
07001     数学        
07001     英语        
查詢結果    
學號       選修課
07001     語文;數學;英語


------解决方案--------------------
create function dbo.uf_gets(@学号 varchar(10))
returns varchar(100)
as
begin
declare @s varchar(100)
set @s= ' '
select @s=@s+ '; '+选修课 from 表 where 学号=@学号
set @s=stuff(@s,1,1, ' ')
return @s
end
go
select 学号,dbo.uf_gets(学号) as '选修课 ' from 表
------解决方案--------------------
用函数是可以的,你要考虑效率,用case 语句吧,
你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
------解决方案--------------------
你用我的表測試:
借用你的函數:
CREATE FUNCTION dbo.uf_gets(@name varchar(100)) RETURNS varchar(100)
AS BEGIN DECLARE @s varchar(100)
SET @s = ' '
SELECT @s = @s + '; ' + name1
FROM ytest
WHERE name2 = @name
SET @s = stuff(@s, 1, 1, ' ') RETURN @s
END

表結構
name1 char (10),
name2 char(10),
[value] char(10)

內容:
name1 name2 value
1 2 2
2 2 1
3 2
4 5 2

測試:
select name2, dbo.uf_gets(2) from ytest group by name2

你再試下呢?
------解决方案--------------------
傳學號就是對表中所有學號對應的課程名稱進行合併,如果傳一個具體值就只合併那一個學號所對應的課程名稱了

你把這個函數看成是sum()函數就行了,功能是一樣的