http://topic.csdn.net/u/20101124/16/0edbbeda-627a-4c36-8a34-c979302fb0b0.html
还是来SQL区发下吧。
其实就是多行合起来,前面一样几列一样,最后一列拼起来.
我现在有个表 字段如下    standards amount variation statuss      Reason
  1. 55         279    4      物量积压     加工人员设备不足;T排制作进度较慢;
  2. 55         279    4      物量积压     部件人员不足;
  3. 55         279    4      物量积压     跨间场地积压;图纸问题较多; 
  4.
  5.
  不确定多少行,
  我想得到如下查询前面几个字段一样最后一列合并成一列,上面那个表也是我通过一段SQL 查出来的不是现成的表,查询语句 如下  
        select Z.标准 as standards,
          Z.实际数量 as amount,
          Z.差异 as variation,
          Z.statuss as statuss,
          Y.Reason as Reason
   from 
   (
       select 55 As 标准,
            SUM(B.SessionNum) As 实际数量,
           (SUM(B.SessionNum)-55)/55 As 差异,
           case 
                when (SUM(B.SessionNum)-55)/55>=-1 AND (SUM(B.SessionNum)-55)/55<0.05 then '物量不足'
                when (SUM(B.SessionNum)-55)/55>=0.05 AND (SUM(B.SessionNum)-55)/55<=0.15 then '正常'
                when (SUM(B.SessionNum)-55)/55>0.15 AND (SUM(B.SessionNum)-55)/55<10 then '物量积压'
           end As statuss 
        from 
        (
            select ShipID,SessionID from ShipProgress_Pretreatment where  
             (EndDate_Delivery is null or EndDate_Delivery='' or convert(datetime,EndDate_Delivery)<='2010-11-24' )  
              AND
             (EndDate_C is null or EndDate_C='' or convert(datetime,EndDate_C)>'2010-11-24' )
         ) A
         inner join T_ShipSession B on A.ShipID=B.ShipID AND B.SessionID=A.SessionID
    ) Z 
    Left join T_BufferReason Y on Z.statuss=Y.BufferStatus AND Y.BufferType='1'
    
  
  最终效果如下 
 standards   amount    variation   statuss            Reason
     55        279        4         物量积压      加工人员设备不足;T排制作进度较慢;部件人员不足;跨间场地积压;图纸问题较多; 

解决方案 »

  1.   

          http://topic.csdn.net/u/20091221/11/3c7d1d86-9211-446b-8ae3-fb37d7763a68.html?79240
         之前大侠们写的,可供参照.
      

  2.   

    --drop table tb
    CREATE TABLE tb
    (standards int, amount int, variation int,statuss int,Reason varchar(50),)
    insert into tb values(1,55,279,4,'物量积压 加工人员设备不足;T排制作进度较慢;')
    insert into tb values(2,55,279,4,' 部件人员不足;')
    insert into tb values(3,55,279,4,' 跨间场地积压;图纸问题较多;')select * from tb
    --drop function dbo.fn_strSumCREATE FUNCTION dbo.fn_strSum(@amount int,@variation int,@statuss int)
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @values varchar(8000)
        SET @values = ''
        SELECT @values = @values + ',' + Reason FROM tb WHERE amount=@amount
    and variation=@variation and  statuss=@statuss
        RETURN STUFF(@values, 1, 1, '')
    END
    GO-- 调用函数
    SELECT amount,variation,statuss, Reason = dbo.fn_strSum(amount,variation,statuss) FROM tb GROUP BY amount,variation,statuss
      

  3.   

    CREATE TABLE tb(standards varchar(50), amount varchar(50), variation varchar(50),statuss varchar(50),Reason varchar(50))insert into tb values('55','279','4','物量积压','加工人员设备不足;T排制作进度较慢;')
    insert into tb values('55','279','4','物量积压','部件人员不足;')
    insert into tb values('55','279','4','物量积压','跨间场地积压;图纸问题较多;')
    insert into tb values('56','300','4','物量积压','AAAA;')
    insert into tb values('56','300','4','物量积压','BBBB;')
    insert into tb values('56','300','4','物量积压','CCCC;')select * from tb
    goCreate   function  [dbo].[F_getReason] (@standards varchar(100),@amount varchar(100),@variation varchar(100),@statuss varchar(100))
    returns varchar(8000)
    as begin
    declare @re varchar(300)
    set @re =''select @re = @re +','+Cast(Reason as varchar) 
    from (
    select standards,amount ,variation ,statuss,Reason from tb ---此处用你查询出来的那个数据表
    )a
    where a.standards=@standards and a.amount=@amount and a.variation=@variation and a.statuss=@statussreturn (stuff(@re,1,1,''))end goselect distinct standards,amount,variation,statuss,Reason=dbo.F_getReason(standards,amount,variation,statuss) from tb drop table tb
    drop function  [dbo].[F_getReason]运行结果:
    ------------------------------
    55 279 4 物量积压 加工人员设备不足;T排制作进度较,部件人员不足;,跨间场地积压;图纸问题较多;
    56 300 4 物量积压 AAAA;,BBBB;,CCCC;
      

  4.   

    /*
    标题:按某字段合并字符串之一(简单合并)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-11-06
    地点:广东深圳描述:将如下形式的数据按id字段合并value字段。
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     value
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即:group by id, 求 value 的和(字符串相加)
    */
    --1、sql2000中只能用自定义的函数解决
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    gocreate function dbo.f_str(@id varchar(10)) returns varchar(1000)
    as
    begin
      declare @str varchar(1000)
      select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
      return @str
    end
    go--调用函数
    select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
    drop table tb
    --2、sql2005中的方法
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
    from tb
    group by iddrop table tb
    --3、使用游标合并数据
    create table tb(id int, value varchar(10))
    insert into tb values(1, 'aa')
    insert into tb values(1, 'bb')
    insert into tb values(2, 'aaa')
    insert into tb values(2, 'bbb')
    insert into tb values(2, 'ccc')
    go
    declare @t table(id int,value varchar(100))--定义结果集表变量
    --定义游标并进行合并处理
    declare my_cursor cursor local for
    select id , value from tb
    declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
    open my_cursor
    fetch my_cursor into @id , @value
    select @id_old = @id , @s=''
    while @@FETCH_STATUS = 0
    begin
        if @id = @id_old
           select @s = @s + ',' + cast(@value as varchar)
        else
          begin
            insert @t values(@id_old , stuff(@s,1,1,''))
            select @s = ',' + cast(@value as varchar) , @id_old = @id
          end
        fetch my_cursor into @id , @value
    END
    insert @t values(@id_old , stuff(@s,1,1,''))
    close my_cursor
    deallocate my_cursorselect * from @t
    drop table tb