學號 選修課 
07001  语文    
07001  数学    
07001  英语    
查詢結果  
學號   選修課
07001  語文;數學;英語

解决方案 »

  1.   

    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 表
      

  2.   

    --創建函數
    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
    學號
      

  3.   

    --創建測試環境
    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 语文;數學;英語
    */
      

  4.   

    clbenben() ( ) 信誉:100  2007-07-19 14:36:25  得分: 0  
     
     
       如果是多个 学号呢.
      
     
    ------------------
    以上函數同樣可以適用多個學號的。
      

  5.   

    --創建測試環境
    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 英語*/
      

  6.   

    用函数是可以的,你要考虑效率,用case 语句吧,
    你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
    我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
      

  7.   

    pastbee() ( ) 信誉:100  2007-07-19 17:19:41  得分: 0  
     
     
       用函数是可以的,你要考虑效率,用case 语句吧,
    你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
    我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
      
     
    -------------這個用CASE可以實現嗎?你寫出來看看。
      

  8.   

    pastbee() ( ) 信誉:100  2007-07-19 17:19:41  得分: 0  
     
     
       用函数是可以的,你要考虑效率,用case 语句吧,
    你要看例子,在我的qq群32097372 里面有专门的文章,其实你的问题是竖表变横表,
    我发现论坛里面有很多这样的帖子,有兴趣加我的qq群
      
    --------------------------------------------------
    拉客的!
      

  9.   

    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
      

  10.   

    wendy_fw(文子) ( ) 信誉:100  2007-07-20 17:01:11  得分: 0  
     
     
       二樓三樓的方法只能實現一個學號的, 如果我要出來所有學號的,就不行了.可以用遊標實現.
      
     
    ------------------亂說。 我上面都寫出了多個學號的例子,函數一樣可以用。別沒事就用游標,游標的效率太低了。
      

  11.   

    wendy_fw(文子) ( ) 信誉:100  2007-07-20 17:01:11  得分: 0  
     
     
       二樓三樓的方法只能實現一個學號的, 如果我要出來所有學號的,就不行了.可以用遊標實現.
      
    ------------------------------------------------------------怎样不行的?
      

  12.   

    即假設有兩個學號,07001  语文    
    07001  数学    
    07001  英语    
    007002 計算機你們的方法: Select 學號, dbo. F_TEST(007001) As 選修課 From 表 Group By 學號 得到如下結果,  
    學號   選修課
    07001  語文;數學;英語
    07002  語文;數學;英語  ---> ???結果有問題哦.
      

  13.   

    wendy_fw(文子) , 你測試過沒有?看看上面我寫的第二個例子吧。
      

  14.   

    你用我的表測試:
    借用你的函數:
    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你再試下呢?
      

  15.   

    函數有問題嗎?看看我們是怎麼調用的,你是怎麼調用的。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
      

  16.   

    我才发现我的是有点问题,加一个distinctselect distinct 学号,dbo.uf_gets(学号) as '选修课' from 表
      

  17.   

    @paoluo(一天到晚游泳的鱼) 请教一个问题,为什么要给语句“Select 學號, dbo. F_TEST(學號) As 選修課 From 表 Group By 學號”
    F_TEST函数传入“學號”,这是什么意思?
     为什么不直接传入真正的学号呢?比如'07001'之类
      

  18.   

    傳學號就是對表中所有學號對應的課程名稱進行合併,如果傳一個具體值就只合併那一個學號所對應的課程名稱了你把這個函數看成是sum()函數就行了,功能是一樣的
      

  19.   

    sex_pig(雨过天晴) ( ) 信誉:100  2007-7-22 17:33:32  得分: 0  
     
     
       
    用函数的方法,如果数据量小的花,那么性能有很大的问题
    我曾经用100w数据,结果要10小时以上  
     
    --------------
    在SQL2000下,目前只能用函數去實現了。2005下,就可以不用寫函數了。