表:productname    color
A        red
A        blue
b        yellow
........
显示如下结果name   color
A       red,blue
b       yellow
.....
要求不用临时表和中间变量

解决方案 »

  1.   

    去SQL版块问,有现成的答案...
      

  2.   

    create function dbo.f_str(@id nvarchar) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ',' + cast(value as varchar) from tb where id = @id
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select name , value = dbo.f_str(name) from tb group by name
      

  3.   

    个人建议对于数据处理用程序代码写,尽量不要依赖SQL,比如这个例子,先把原始数据取出来,用简单的循环代码处理即可。
    用程序来控制数据逻辑,而不依赖SQL语法来处理,一个很复杂的SQL处理在程序内简单的代码就可以处理,也较少了后续维护的复杂性。
      

  4.   

    大数据量,程序处理是不现实的,还是得依靠sql
      

  5.   

    我写出来了,符合题目要求,只是有点复杂。其中(select * from test_a group by name,color) 是为了消除颜色重复,
    case when count(color)=1 then substr(max(color),2) else  max(color) end 是为了解决一种情况:如果有一个分组只有一行,那么查询出来的color字段前会有个逗号问题
    select name,
       case when count(color)=1 then substr(max(color),2) else  max(color) end color
        from (select name,concat(concat(lag(color)over(partition by name order by color ),','),color)as color  
                 from (select * from test_a group by name,color) )
        group by nameNAME COLOR
    A blue,red
    B yellow楼主测试下
      

  6.   

    这个函数有问题,修正如下
    Select T1.Name, Substr(Max(Sys_Connect_By_Path(T1.Color, ',')), 2) Color
    From (Select a.Name, a.Color, Row_Number() Over(Partition By a.Name Order By a.Color) Rn From (select * from test_a group by name,color) a) T1
    Start With T1.Rn = 1
    Connect By T1.Name = Prior T1.Name And T1.Rn - 1 = Prior T1.Rn
    Group By T1.Name;