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 表
--創建函數 Create Function F_TEST(@學號 Varchar(100)) Returns Nvarchar(1000) As Begin Declare @S Nvarchar(1000) Select @S = '' Select @S = @S + ';' + 選修課 From 表 Where 學號 = @學號 Select @S = Stuff(@S, 1, 1, '') Return @S End GO --測試 Select 學號, dbo. F_TEST(學號) As 選修課 From 表 Group By 學號
--創建測試環境 Create Table 表 (學號 Varchar(100), 選修課 Nvarchar(100)) Insert 表 Select '07001', N'语文' Union All Select '07001', N'數學' Union All Select '07001', N'英語' GO --創建函數 Create Function F_TEST(@學號 Varchar(100)) Returns Nvarchar(1000) As Begin Declare @S Nvarchar(1000) Select @S = '' Select @S = @S + ';' + 選修課 From 表 Where 學號 = @學號 Select @S = Stuff(@S, 1, 1, '') Return @S End GO --測試 Select 學號, dbo. F_TEST(學號) As 選修課 From 表 Group By 學號 GO --刪除測試環境 Drop Table 表 Drop Function F_TEST --結果 /* 學號 選修課 07001 语文;數學;英語 */
clbenben() ( ) 信誉:100 2007-07-19 14:36:25 得分: 0
如果是多个 学号呢.
------------------ 以上函數同樣可以適用多個學號的。
--創建測試環境 Create Table 表 (學號 Varchar(100), 選修課 Nvarchar(100)) Insert 表 Select '07001', N'语文' Union All Select '07001', N'數學' Union All Select '07001', N'英語' Union All Select '07002', N'數學' Union All Select '07002', N'英語' Union All Select '07003', N'英語' GO --創建函數 Create Function F_TEST(@學號 Varchar(100)) Returns Nvarchar(1000) As Begin Declare @S Nvarchar(1000) Select @S = '' Select @S = @S + ';' + 選修課 From 表 Where 學號 = @學號 Select @S = Stuff(@S, 1, 1, '') Return @S End GO --測試 Select 學號, dbo. F_TEST(學號) As 選修課 From 表 Group By 學號 GO --刪除測試環境 Drop Table 表 Drop Function F_TEST --結果 /* 學號 選修課 07001 语文;數學;英語 07002 數學;英語 07003 英語*/
declare @t Table(ID Varchar(100),class varchar(100)) Insert @t Select '07001', N'语文' Union All Select '07001', N'數學' Union All Select '07001', N'英語' Union All Select '07002', N'數學' Union All Select '07002', N'英語' Union All Select '07003', N'英語'select id,class=max(class1)+max(class2)+max(class3) from ( select id,class1=(case [no] when 0 then class else '' end), class2=(case no when 1 then ','+class else '' end), class3=(case no when 2 then ','+class else '' end) from ( select id,class,[no]=(select count(9) from @t where id=a.id and class<a.class) from @t a ) t ) t group by id
即假設有兩個學號,07001 语文 07001 数学 07001 英语 007002 計算機你們的方法: Select 學號, dbo. F_TEST(007001) As 選修課 From 表 Group By 學號 得到如下結果, 學號 選修課 07001 語文;數學;英語 07002 語文;數學;英語 ---> ???結果有問題哦.
wendy_fw(文子) , 你測試過沒有?看看上面我寫的第二個例子吧。
你用我的表測試: 借用你的函數: 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你再試下呢?
函數有問題嗎?看看我們是怎麼調用的,你是怎麼調用的。Select 學號, dbo. F_TEST(學號) As 選修課 From 表 Group By 學號你的 Select 學號, dbo. F_TEST(007001) As 選修課 From 表 Group By 學號 還有你上面的例子是怎麼調用的。select name2, dbo.uf_gets(2) from ytest group by name2
我才发现我的是有点问题,加一个distinctselect distinct 学号,dbo.uf_gets(学号) as '选修课' from 表
@paoluo(一天到晚游泳的鱼) 请教一个问题,为什么要给语句“Select 學號, dbo. F_TEST(學號) As 選修課 From 表 Group By 學號” F_TEST函数传入“學號”,这是什么意思? 为什么不直接传入真正的学号呢?比如'07001'之类
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 表
Create Function F_TEST(@學號 Varchar(100))
Returns Nvarchar(1000)
As
Begin
Declare @S Nvarchar(1000)
Select @S = ''
Select @S = @S + ';' + 選修課 From 表 Where 學號 = @學號
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
--測試
Select
學號,
dbo. F_TEST(學號) As 選修課
From
表
Group By
學號
Create Table 表
(學號 Varchar(100),
選修課 Nvarchar(100))
Insert 表 Select '07001', N'语文'
Union All Select '07001', N'數學'
Union All Select '07001', N'英語'
GO
--創建函數
Create Function F_TEST(@學號 Varchar(100))
Returns Nvarchar(1000)
As
Begin
Declare @S Nvarchar(1000)
Select @S = ''
Select @S = @S + ';' + 選修課 From 表 Where 學號 = @學號
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
--測試
Select
學號,
dbo. F_TEST(學號) As 選修課
From
表
Group By
學號
GO
--刪除測試環境
Drop Table 表
Drop Function F_TEST
--結果
/*
學號 選修課
07001 语文;數學;英語
*/
如果是多个 学号呢.
------------------
以上函數同樣可以適用多個學號的。
Create Table 表
(學號 Varchar(100),
選修課 Nvarchar(100))
Insert 表 Select '07001', N'语文'
Union All Select '07001', N'數學'
Union All Select '07001', N'英語'
Union All Select '07002', N'數學'
Union All Select '07002', N'英語'
Union All Select '07003', N'英語'
GO
--創建函數
Create Function F_TEST(@學號 Varchar(100))
Returns Nvarchar(1000)
As
Begin
Declare @S Nvarchar(1000)
Select @S = ''
Select @S = @S + ';' + 選修課 From 表 Where 學號 = @學號
Select @S = Stuff(@S, 1, 1, '')
Return @S
End
GO
--測試
Select
學號,
dbo. F_TEST(學號) As 選修課
From
表
Group By
學號
GO
--刪除測試環境
Drop Table 表
Drop Function F_TEST
--結果
/*
學號 選修課
07001 语文;數學;英語
07002 數學;英語
07003 英語*/
你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
用函数是可以的,你要考虑效率,用case 语句吧,
你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
-------------這個用CASE可以實現嗎?你寫出來看看。
用函数是可以的,你要考虑效率,用case 语句吧,
你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
--------------------------------------------------
拉客的!
Insert @t Select '07001', N'语文'
Union All Select '07001', N'數學'
Union All Select '07001', N'英語'
Union All Select '07002', N'數學'
Union All Select '07002', N'英語'
Union All Select '07003', N'英語'select id,class=max(class1)+max(class2)+max(class3) from
(
select id,class1=(case [no] when 0 then class else '' end),
class2=(case no when 1 then ','+class else '' end),
class3=(case no when 2 then ','+class else '' end) from
(
select id,class,[no]=(select count(9) from @t where id=a.id and class<a.class) from @t a
) t
) t
group by id
二樓三樓的方法只能實現一個學號的, 如果我要出來所有學號的,就不行了.可以用遊標實現.
------------------亂說。 我上面都寫出了多個學號的例子,函數一樣可以用。別沒事就用游標,游標的效率太低了。
二樓三樓的方法只能實現一個學號的, 如果我要出來所有學號的,就不行了.可以用遊標實現.
------------------------------------------------------------怎样不行的?
07001 数学
07001 英语
007002 計算機你們的方法: Select 學號, dbo. F_TEST(007001) As 選修課 From 表 Group By 學號 得到如下結果,
學號 選修課
07001 語文;數學;英語
07002 語文;數學;英語 ---> ???結果有問題哦.
借用你的函數:
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你再試下呢?
Select 學號, dbo. F_TEST(007001) As 選修課 From 表 Group By 學號 還有你上面的例子是怎麼調用的。select name2, dbo.uf_gets(2) from ytest group by name2
F_TEST函数传入“學號”,这是什么意思?
为什么不直接传入真正的学号呢?比如'07001'之类
用函数的方法,如果数据量小的花,那么性能有很大的问题
我曾经用100w数据,结果要10小时以上
--------------
在SQL2000下,目前只能用函數去實現了。2005下,就可以不用寫函數了。