--带符号合并行列转换--有表t,其数据如下:
  a b
  1 1
  1 2
  1 3
  2 1
  2 2
  3 1
--如何转换成如下结果:
  a b
  1 1,2,3
  2 1,2
  3 1 create table tb
(
   a int,
   b int
)
insert into tb(a,b) values(1,1)
insert into tb(a,b) values(1,2)
insert into tb(a,b) values(1,3)
insert into tb(a,b) values(2,1)
insert into tb(a,b) values(2,2)
insert into tb(a,b) values(3,1)
goif object_id('pubs..f_hb') is not null
   drop function f_hb
go--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
  declare @str varchar(8000)
  set @str = ''
  select @str = @str + ',' + cast(b as varchar) from tb where a = @a 
  set @str = right(@str , len(@str) - 1)
  return(@str)
End
go--调用自定义函数得到结果:
select distinct a ,dbo.f_hb(a) as b from tbdrop table tb--结果
a           b     
----------- ------
1           1,2,3
2           1,2
3           1(所影响的行数为 3 行)
多个前列的合并
数据的原始状态如下:
ID  PR   CON  OP    SC 
001 p    c    差    6
001 p    c    好    2
001 p    c    一般  4
002 w    e    差    8
002 w    e    好    7
002 w    e    一般  1
===========================
用SQL语句实现,变成如下的数据
ID  PR   CON  OPS
001 p    c    差(6),好(2),一般(4)
002 w    e    差(8),好(7),一般(1)if object_id('pubs..tb') is not null
   drop table tb
gocreate table tb
(
id varchar(10),
pr varchar(10),
con varchar(10),
op varchar(10),
sc int
)
 
insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '差',    6)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '好',    2)
insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '一般',  4)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '差',    8)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '好',    7)
insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '一般',  1)
goif object_id('pubs..test') is not null
   drop table test
go
select ID,PR,CON , OPS = op + '(' + cast(sc as varchar(10)) + ')' into test from tb--创建一个合并的函数
if object_id('pubs..f_hb') is not null
   drop function f_hb
go
create function f_hb(@id varchar(10),@pr varchar(10),@con varchar(10))
returns varchar(8000)
as
begin
  declare @str varchar(8000)
  set @str = ''
  select @str = @str + ',' + cast(OPS as varchar) from test where id = @id and @pr = pr and @con = con
  set @str = right(@str , len(@str) - 1)
  return(@str)
End
go--调用自定义函数得到结果:
select distinct id ,pr , con , dbo.f_hb(id,pr,con) as OPS from testdrop table tb
drop table test--结果
id         pr         con        OPS                
---------- ---------- ---------- -------------------
001        p          c          差(6),好(2),一般(4)
002        w          e          差(8),好(7),一般(1)(所影响的行数为 2 行)create table b
(col varchar(20))insert b values ('a')
insert b values ('b')
insert b values ('c')
insert b values ('d')
insert b values ('e')
declare @sql varchar(1024)
set @sql=''
select @sql=@sql+b.col+',' from (select col from b) as b
set @sql='select '''+@sql+''''
exec(@sql)

解决方案 »

  1.   

    ----创建函数
    create function fnMerge(@id varchar(10))
    returns varchar(8000)
    as
    begin
        declare @str varchar(8000)
        set @str = ''
        select @str = @str + ',,' + strn from viewname where id = @id
        return stuff(@str,1,2,'')
    end
    GO
    ----调用函数
    select id,dbo.fnMerge(id) as strn from viewname group by id
      

  2.   

    if object_id('vTest') is not null
    drop view vTest
    if object_id('fnMerge') is not null
    drop function fnMerge
    GO
    create view vTest
    as
    select 'z01' as id,'asd' as strn union all
    select 'z01' as id,'sdf' as strn union all
    select 'z02' as id,'qwe' as strn union all
    select 'z03' as id,'jkl' as strn union all
    select 'z03' as id,'iop' as strn
    GO
    ----创建函数
    create function fnMerge(@id varchar(10))
    returns varchar(8000)
    as
    begin
        declare @str varchar(8000)
        set @str = ''
        select @str = @str + ',,' + strn from vTest where id = @id
        return stuff(@str,1,2,'')
    end
    GO
    ----调用函数
    select id,dbo.fnMerge(id) as strn from vTest group by id----清除测试环境
    drop view vTest
    drop function fnMerge/*结果
    id   strn 
    ---- ---------
    z01  asd,,sdf
    z02  qwe
    z03  jkl,,iop
    */
      

  3.   

    那就用hellowork(一两清风) 的方法吧,自己寫一個聚合函數就行了
      

  4.   

    SQL 2000中常用的处理方式有两种:1、如楼上所述,用自定义函数
    2、用游标处理。
      

  5.   

    SELECT id,
    strn=CAST(MIN(strn) as varchar)
    +CASE 
    WHEN COUNT(*)=1 THEN ''
    ELSE ','+CAST(MAX(strn) as varchar)
    END
    FROM a17
    GROUP BY id这个方法很好 2秒就搞定了
      

  6.   

    SQL 2000中常用的处理方式有两种:1、如楼上所述,用自定义函数
    2、用游标处理。
    --------------------------------------------------------
    wangtiecheng说得不错,不过函数应该是首先
      

  7.   

    --楼上的真是好方法:create table T(id varchar(100), strn varchar(100))
    insert into T select 'z01','asd'
    insert into T select 'z01','sdf'
    insert into T select 'z02','qwe'
    insert into T select 'z03','jkl'
    insert into T select 'z04','iop'
    SELECT id,
    CAST(MIN(strn) as varchar(100)) +
    CASE 
    WHEN COUNT(*)=1 THEN ''
    ELSE ','+CAST(MAX(strn) as varchar(100))
    END as strn
    FROM T
    GROUP BY id
    drop table T