学生                       教师                    教师评价
学生1                      教师1                   优
学生1                      教师2                   一般
学生2                      教师1                   一般
学生2                      教师2                   差
学生3                      教师1                   优想得到的结果是每个学生的全部评价,用逗号隔开。
学生      教师评价学生1     优,一般
学生2     一般,差
学生3     优最好一条语句能搞定吗?

解决方案 »

  1.   

    if object_id('tb') is not null
    drop table tb
    create table tb(aa varchar(20),bb varchar(20))
    insert into tb select '奥米茄',  '地板' union all
    select '瓷砖' ,'地板' union all
    select '蒙娜丽莎','厨房设备' union all 
    select '实木复合地板' ,'涂料' select  [values]=stuff((select '|'+aa from tb t where bb=tb.bb for xml path('')), 1, 1, ''),bb
    from tb 
    group by bb 
    /*bb                   values
    -------------------- --------------------
    厨房设备                 蒙娜丽莎
    地板                   奥米茄|瓷砖
    涂料                   实木复合地板(3 行受影响)
    */\
    参考
      

  2.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-09-19 10:45:26
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
    insert [tb]
    select '学生1','教师1','优' union all
    select '学生1','教师2','一般' union all
    select '学生2','教师1','一般' union all
    select '学生2','教师2','差' union all
    select '学生3','教师1','优'
    --------------开始查询--------------------------
    select 学生, [教师评价]=stuff((select ','+[教师评价] from tb t where 学生=tb.学生 for xml path('')), 1, 1, '') 
    from tb 
    group by 学生 
    ----------------结果----------------------------
    /* 学生    教师评价
    ----- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    学生1   优,一般
    学生2   一般,差
    学生3   优(3 行受影响)
    */
      

  3.   

    -- =========================================
    -- -----------t_mac 小编-------------------
       --------------------希望有天成为大虾---- 
    -- =========================================IF OBJECT_ID('tb') IS NOT NULL
    DROP TABLE tb
    GO
    CREATE TABLE tb( a  varchar(10),b  varchar(10) , c varchar(10) )
    go
    insert tb SELECT 
    '学生1',                      '教师1'   ,               '优' UNION ALL SELECT 
    '学生1',                      '教师2'  ,               '一般' UNION ALL SELECT 
    '学生2',                      '教师1'  ,                '一般' UNION ALL SELECT 
    '学生2',                      '教师2'  ,                '差' UNION ALL SELECT 
    '学生3',                      '教师1' ,                 '优' 
    go
    select distinct  a as 学生, 
    教师评价=STUFF((select ','+c from tb t where tb.a=t.a for xml path('') ),1,1,'')
    from tb 学生         教师评价
    ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    学生1        优,一般
    学生2        一般,差
    学生3        优
      

  4.   

    ---2000用函数
    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-09-19 10:45:26
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
    insert [tb]
    select '学生1','教师1','优' union all
    select '学生1','教师2','一般' union all
    select '学生2','教师1','一般' union all
    select '学生2','教师2','差' union all
    select '学生3','教师1','优'
    --------------开始查询--------------------------
    CREATE FUNCTION dbo.f_strUnite(@id varchar(50)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + 教师评价 FROM tb WHERE 学生=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    -- 调用函数 
    SELECT 学生, 教师评价 = dbo.f_strUnite(学生) FROM tb GROUP BY 学生 
    drop table tb 
    drop function dbo.f_strUnite 
    go 
    ----------------结果----------------------------
    /* 学生    教师评价
    ----- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    学生1   优,一般
    学生2   一般,差
    学生3   优(3 行受影响)
    */
      

  5.   

    2000的做法 函数 
    -- =========================================
    -- -----------t_mac 小编-------------------
       --------------------希望有天成为大虾---- 
    -- =========================================IF OBJECT_ID('tb') IS NOT NULL
    DROP TABLE tb
    GO
    CREATE TABLE tb( a  varchar(10),b  varchar(10) , c varchar(10) )
    go
    insert tb SELECT 
    '学生1',                      '教师1'   ,               '优' UNION ALL SELECT 
    '学生1',                      '教师2'  ,               '一般' UNION ALL SELECT 
    '学生2',                      '教师1'  ,                '一般' UNION ALL SELECT 
    '学生2',                      '教师2'  ,                '差' UNION ALL SELECT 
    '学生3',                      '教师1' ,                 '优' 
    go
    CREATE FUNCTION dbo.f_tb(@id varchar(10)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + c FROM tb WHERE a=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO SELECT a as 学生, 教师评价 = dbo.f_tb(a) FROM tb GROUP BY a 
    drop table tb 
    drop function dbo.f_tb 
    学生         教师评价
    ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    学生1        优,一般
    学生2        一般,差
    学生3        优
      

  6.   


    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
    insert [tb]
    select '学生1','教师1','优' union all
    select '学生1','教师2','一般' union all
    select '学生2','教师1','一般' union all
    select '学生2','教师2','差' union all
    select '学生3','教师1','优' 
    create function f_join(@学生 as varchar(50))
    returns varchar(200)
    as 
    begin
    declare @s varchar(200)
     select @s=isnull(@s+',','')+[教师评价] from tb where [学生]=@学生 
    return @s
    end
    select [学生],教师评价=dbo.f_join([学生]) from [tb] group by [学生]/*
    学生    教师评价
    ----- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    学生1   优,一般
    学生2   一般,差
    学生3   优(3 行受影响)*/
      

  7.   

    --sql 2000,使用函数解决.
    create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
    insert [tb]
    select '学生1','教师1','优' union all
    select '学生1','教师2','一般' union all
    select '学生2','教师1','一般' union all
    select '学生2','教师2','差' union all
    select '学生3','教师1','优'
    gocreate function dbo.f_str(@学生 varchar(5)) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ',' + cast(教师评价 as varchar) from tb where 学生 = @学生
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select 学生 , 教师评价 = dbo.f_str(学生) from tb group by 学生drop function dbo.f_str
    drop table tb/*
    学生    教师评价       
    ----- ----------------
    学生1   优,一般
    学生2   一般,差
    学生3   优(所影响的行数为 3 行)
    */--sql 2005
    create table [tb]([学生] nvarchar(5),[教师] nvarchar(5),[教师评价] nvarchar(4))
    insert [tb]
    select N'学生1',N'教师1',N'优' union all
    select N'学生1',N'教师2',N'一般' union all
    select N'学生2',N'教师1',N'一般' union all
    select N'学生2',N'教师2',N'差' union all
    select N'学生3',N'教师1',N'优'
    goselect 学生, [教师评价] = stuff((select ',' + [教师评价] from tb t where 学生 = tb.学生 for xml path('')) , 1 , 1 , '')
    from tb
    group by 学生drop table tb/*
    学生    教师评价
    ----- ------------
    学生1   优,一般
    学生2   一般,差
    学生3   优(3 行受影响)
    */
      

  8.   

    if object_id('tb') is not null drop table tb
    go create table tb([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
    insert tb
    select '学生1','教师1','优' union all
    select '学生1','教师2','一般' union all
    select '学生2','教师1','一般' union all
    select '学生2','教师2','差' union all
    select '学生3','教师1','优'
    --------------开始查询--------------------------
    CREATE FUNCTION dbo.f_strUnite(@学生 varchar(50)) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str ='' 
        SELECT @str = @str + ',' + 教师评价 FROM tb WHERE 学生=@学生 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO select distinct([学生]),dbo.f_strUnite([学生]) as 教师评价 from tb学生    教师评价
    ----- ----------------
    学生1   优,一般
    学生2   一般,差
    学生3   优