有很多这样的帖子:
参考吧:
http://community.csdn.net/Expert/topic/4056/4056300.xml?temp=.7806665

解决方案 »

  1.   

    --建立测试环境
    Create table 科目
    (Id Int Identity(1,1),
     科目名称 Nvarchar(10))Create table 成绩
    (Id Int Identity(1,1),
     姓名 Nvarchar(10),
     得分 Int,
     PId Int)
    --插入数据
    Insert 科目 Values(N'语文')
    Insert 科目 Values(N'数学')Insert 成绩 Values(N'张三',     80,       1)
    Insert 成绩 Values(N'李四',     90,       1)
    Insert 成绩 Values(N'王五',     70,       1)
    Insert 成绩 Values(N'张三',     80,       2)
    Insert 成绩 Values(N'王五',     90,       2)
    GO
    --建立函数
    Create Function GetName(@ID Int)
    Returns Nvarchar(1000)
    As
    Begin
        Declare @S Nvarchar(1000)
        Set @S=''
        Select @S=@S+','+姓名 from 成绩 Where Pid=@ID Order by ID
        Return Stuff(@S,1,1,'')
    End
    GO
    --测试
    Select 
    A.科目名称,
    dbo.GetName(A.ID) As 姓名,
    AVG(B.得分) As 平均分
    from 科目 A
    Left Join 成绩 B
    On A.ID=B.PId
    Group By A.ID,A.科目名称
    Order By A.ID
    --删除测试环境
    Drop table 科目,成绩
    Drop Function GetName
    --结果
    /*
    科目名称 姓名 平均分
    语文 张三,李四,王五 80
    数学 张三,王五 85
    */