诚心求教论坛的各位SQL技术达人指点迷津。
手上有个项目,求一条sql语句,对一组数据进行汇总。
数据如下:
表A
字段1    字段2        字段3      字段4                   字段5     字段6        ..... 
A00001    检测浓度    盐酸        应在80%-99%            98%       合格
A00001    检测浓度    盐酸        应在80%-99%            92%       合格
A00001    检测浓度    盐酸        应在80%-99%            93%       合格
A00001    检测浓度    盐酸        应在80%-99%            97%       合格A00001    检测外观    盐酸        应为无色无味           无色无味  合格     
A00001    检测外观    盐酸        应为无色无味           无色无味  合格
A00001    检测外观    盐酸        应为无色无味           无色无味  不合格
A00001    检测浓度    硫酸        应在80%-99%            97%       合格
A00001    检测浓度    硫酸        应在80%-99%            93%       合格
 
A00002    检测浓度    盐酸        应在80%-99%            98%       合格
A00002    检测浓度    盐酸        应在80%-99%            92%       合格
A00002    检测浓度    盐酸        应在80%-99%            93%       合格
A00002    检测浓度    盐酸        应在80%-99%            97%       不合格....
....现求一条sql语句,查询后想要得到如下结果:
字段1    字段2        字段3      字段4                   字段5                字段6   A00001    检测浓度    盐酸        应在80%-99%            98%,92%,93%,97%      合格
A00001    检测外观    盐酸        应为无色无味           无色无味             合格,不合格  
A00001    检测浓度    硫酸        应在80%-99%            97%,93%              合格 
A00002    检测浓度    盐酸        应在80%-99%            98%,92%,93%,97%      合格,不合格 主要功能:1.合并重复的项目2.如果字段1-字段4的数据相同,而字段5和字段6中有不同的数据,要在一行里显示出来。3.如果字段1-字段4的数据不同,就不需要合并
请教各位高人该如何实现? 

解决方案 »

  1.   

    --僅供參考
    SQL code问题描述:
    无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
      所以,当我们在处理下列要求时,会比较麻烦:
    有表tb, 如下:
    id    value
    ----- ------
    1     aa
    1     bb
    2     aaa
    2     bbb
    2     ccc
    需要得到结果:
    id     values
    ------ -----------
    1      aa,bb
    2      aaa,bbb,ccc
    即, group by id, 求 value 的和(字符串相加)1. 旧的解决方法-- 1. 创建处理函数
    CREATE FUNCTION dbo.f_str(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SET @r = ''
        SELECT @r = @r + ',' + value
        FROM tb
        WHERE id=@id
        RETURN STUFF(@r, 1, 1, '')
    END
    GO
    -- 调用函数SELECt id, values=dbo.f_str(id) 
    FROM tb 
    GROUP BY id-- 2. 新的解决方法 
    -- 示例数据
    DECLARE @t TABLE(id int, value varchar(10))
    INSERT @t SELECT 1, 'aa'
    UNION ALL SELECT 1, 'bb'
    UNION ALL SELECT 2, 'aaa'
    UNION ALL SELECT 2, 'bbb'
    UNION ALL SELECT 2, 'ccc'-- 查询处理
    SELECT *
    FROM(
        SELECT DISTINCT 
            id
        FROM @t
    )A
    OUTER APPLY(
        SELECT 
            [values]= STUFF(REPLACE(REPLACE(
                (
                    SELECT value FROM @t N
                    WHERE id = A.id
                    FOR XML AUTO
                ), '<N value="', ','), '"/>', ''), 1, 1, '')
    )N/*--结果
    id          values
    ----------- ----------------
    1           aa,bb
    2           aaa,bbb,ccc
    (2 行受影响)
    --*/
      

  2.   

    自己写了段程序试了下,但是字段5里的数据都是有逗号的,相同的文字项合并不了,请高人指点A00001    检测浓度    盐酸        应在80%-99%            98%,92%,93%,97%              合格
    A00001    检测外观    盐酸        应为无色无味           无色无味,无色无味,无色无味   合格  
    A00001    检测浓度    硫酸        应在80%-99%            97%,93%                      合格 
    A00002    检测浓度    盐酸        应在80%-99%            98%,92%,93%,97%              合格 
    不知道怎么把无色无味合并啊CREATE FUNCTION F_COMBINESTR(@ID VARCHAR(8000))
    RETURNS VARCHAR(8000)
    AS 
    BEGIN
      DECLARE  @SQL VARCHAR(8000)
      SET @SQL=''
      SELECT @SQL=@SQL+',' + RESULT
      FROM  Z_COA_DRUG_BODY 
      WHERE STANDARD=@ID
      RETURN STUFF(@SQL, 1, 1, '')
    END
    SELECT PROJECT, TEST_TYPE, REPORTED_NAME, STANDARD, 
          dbo.F_COMBINESTR(STANDARD) AS Expr1, CONCLUSION
    FROM Z_COA_DRUG_BODY
    GROUP BY PROJECT, TEST_TYPE, REPORTED_NAME, STANDARD, CONCLUSION
      

  3.   

    函数那里用DISTINCT 不就好了
      

  4.   

    CREATE FUNCTION F_COMBINESTR(@ID VARCHAR(8000)) 
    RETURNS VARCHAR(8000) 
    AS 
    BEGIN 
      DECLARE  @SQL VARCHAR(8000) 
      SET @SQL='' 
      SELECT @SQL=@SQL+',' + (SELECT DISTINCT RESULT 
      FROM  Z_COA_DRUG_BODY ) AS T

      WHERE STANDARD=@ID 
      RETURN STUFF(@SQL, 1, 1, '') 
    END 
      

  5.   

    如果id是多个字段,就在函数中建立多个变量.
    /*
    标题:按某字段合并字符串之一(简单合并)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间: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 int) 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 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
      

  6.   

    好像提示说 AS 附近有语法错误 - -改为以下
    CREATE FUNCTION F_COMBINESTR(@ID VARCHAR(8000))
    RETURNS VARCHAR(8000)
    AS
    BEGIN
      DECLARE  @SQL VARCHAR(8000)
      SET @SQL=''
      SELECT @SQL=@SQL+',' + (SELECT DISTINCT RESULT
      FROM  Z_COA_DRUG_BODY ) FROM  Z_COA_DRUG_BODY
      WHERE STANDARD=@ID
      RETURN STUFF(@SQL, 1, 1, '')
    END 后 函数没问题 但是调用函数查询是说子查询的数量太多,不能用  
      

  7.   

    /*
    Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   Copyright (c) 
    1988-2008 Microsoft Corporation  Enterprise Evaluation Edition on Windows NT 5.1 <X86> 
    (Build 2600: Service Pack 3) 
     愿和大家共同进步
    如有雷同、实属巧合
    ●●●●●2009-09-04 15:19:28.123●●●●●
     ★★★★★soft_wsx★★★★★
    */
    if object_ID('TB') IS NOT NULL DROP TABLE TB
      create table tb(a nvarchar(20),b nvarchar(20),c nvarchar(20),d nvarchar(20),e nvarchar(20),f nvarchar(20))
    insert tb
    select
    'A00001   ', '检测浓度',    '盐酸',        '应在80%-99%',            '98%'     , '合格'  union all select  
    'A00001  ' , '检测浓度',    '盐酸',        '应在80%-99%' ,           '92%'    ,  '合格'  union all select  
    'A00001  ' , '检测浓度',    '盐酸' ,       '应在80%-99%'  ,          '93%'    ,  '合格'  union all select  
    'A00001 '  , '检测浓度',    '盐酸',        '应在80%-99%'   ,         '97%'    ,  '合格'  union all select  
    'A00001 '  , '检测外观',    '盐酸' ,       '应为无色无味'   ,       '无色无味' , '合格'     union all select  
    'A00001 '   ,'检测外观',    '盐酸'  ,      '应为无色无味'    ,      '无色无味' , '合格'  union all select  
    'A00001'    ,'检测外观',    '盐酸'   ,     '应为无色无味'      ,    '无色无味',  '不合格 ' union all select  
    'A00001'   , '检测浓度',    '硫酸'     ,   '应在80%-99%'      ,      '97%'   ,   '合格 ' union all select  
    'A00001'   , '检测浓度',    '硫酸'    ,    '应在80%-99%'       ,     '93%'   ,   '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'    ,    '应在80%-99%'        ,    '98% '  ,   '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'    ,    '应在80%-99%'         ,   '92% ' ,    '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'     ,   '应在80%-99%'          ,  '93% ' ,    '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'     ,   '应在80%-99%'          ,  '97%  ',    '不合格' 
    go
    if object_id('f_tb') is not null drop function f_tb
    go
      create function f_tb(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
        returns nvarchar(4000)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+e from(select distinct e from tb where a=@a and b=@b and c=@c)a
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    go
    if object_id('f_tb2') is not null drop function f_tb2
    go
      create function f_tb2(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
        returns nvarchar(4000)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+f from(select distinct f from tb where a=@a and b=@b and c=@c)a
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    goselect a,b,c,dbo.f_tb(a,b,c) as e,dbo.f_tb2(a,b,c) as f from tb group by a,b,c 
    /*
    a b c e f
    A00001 检测浓度 硫酸 93%,97% 合格 
    A00001    检测浓度 盐酸 92%,93%,97%,98% 合格
    A00001  检测外观 盐酸 无色无味 不合格 ,合格
    A00002 检测浓度 盐酸 92% ,93% ,97%  ,98%  不合格,合格 
    */
      

  8.   

    /*
    Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   Copyright (c) 
    1988-2008 Microsoft Corporation  Enterprise Evaluation Edition on Windows NT 5.1 <X86> 
    (Build 2600: Service Pack 3) 
     愿和大家共同进步
    如有雷同、实属巧合
    ●●●●●2009-09-11 17:54:44.950●●●●●
     ★★★★★soft_wsx★★★★★
    */
    --
    if object_ID('TB') IS NOT NULL DROP TABLE TB
      create table tb(a nvarchar(20),b nvarchar(20),c nvarchar(20),d nvarchar(20),e nvarchar(20),f nvarchar(20))
    insert tb
    select
    'A00001   ', '检测浓度',    '盐酸',        '应在80%-99%',            '98%'     , '合格'  union all select  
    'A00001  ' , '检测浓度',    '盐酸',        '应在80%-99%' ,           '92%'    ,  '合格'  union all select  
    'A00001  ' , '检测浓度',    '盐酸' ,       '应在80%-99%'  ,          '93%'    ,  '合格'  union all select  
    'A00001 '  , '检测浓度',    '盐酸',        '应在80%-99%'   ,         '97%'    ,  '合格'  union all select  
    'A00001 '  , '检测外观',    '盐酸' ,       '应为无色无味'   ,       '无色无味' , '合格'     union all select  
    'A00001 '   ,'检测外观',    '盐酸'  ,      '应为无色无味'    ,      '无色无味' , '合格'  union all select  
    'A00001'    ,'检测外观',    '盐酸'   ,     '应为无色无味'      ,    '无色无味',  '不合格 ' union all select  
    'A00001'   , '检测浓度',    '硫酸'     ,   '应在80%-99%'      ,      '97%'   ,   '合格 ' union all select  
    'A00001'   , '检测浓度',    '硫酸'    ,    '应在80%-99%'       ,     '93%'   ,   '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'    ,    '应在80%-99%'        ,    '98% '  ,   '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'    ,    '应在80%-99%'         ,   '92% ' ,    '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'     ,   '应在80%-99%'          ,  '93% ' ,    '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'     ,   '应在80%-99%'          ,  '97%  ',    '不合格' 
    go
    if object_id('f_tb') is not null drop function f_tb
    go
      create function f_tb(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
        returns nvarchar(4000)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+e from(select distinct e from tb where a=@a and b=@b and c=@c)a
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    go
    if object_id('f_tb2') is not null drop function f_tb2
    go
      create function f_tb2(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
        returns nvarchar(4000)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+f from(select distinct f from tb where a=@a and b=@b and c=@c)a
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    goselect a,b,c,d,dbo.f_tb(a,b,c) as e,dbo.f_tb2(a,b,c) as f from tb group by a,b,c,d 
    /*
    a b c d e f
    A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格 
    A00001    检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
    A00001  检测外观 盐酸 应为无色无味 无色无味 不合格 ,合格
    A00002 检测浓度 盐酸 应在80%-99% 92% ,93% ,97%  ,98%  不合格,合格 
    */做好了!结贴给分吧!
      

  9.   


    /*---------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2009-09-11 17:44:50
    --  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    Mar 29 2009 10:27:29 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
    --> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([字段1] nvarchar(6),[字段2] nvarchar(4),[字段3] nvarchar(2),[字段4] nvarchar(9),[字段5] nvarchar(4),[字段6] nvarchar(3))
    INSERT [tb]
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
    SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
    SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
    SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'不合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'不合格'
    GO
    --SELECT * FROM [tb]-->SQL查询如下:
    IF NOT OBJECT_ID('[f_str1]') IS NULL
    DROP FUNCTION [f_str1]
    GO
    CREATE FUNCTION f_str1
    (
    @col1 NVARCHAR(200),
    @col2 NVARCHAR(200),
    @col3 NVARCHAR(200),
    @col4 NVARCHAR(200)
    )
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SELECT @r = ISNULL(@r +',','')+ [字段5]
        FROM tb
        WHERE 字段1=@col1 AND 字段2=@col2  
          AND 字段3=@col3 AND 字段4=@col4
        GROUP BY [字段5]
        RETURN @r
    END
    GO
    IF NOT OBJECT_ID('[f_str2]') IS NULL
    DROP FUNCTION [f_str2]
    GO
    CREATE FUNCTION f_str2
    (
    @col1 NVARCHAR(200),
    @col2 NVARCHAR(200),
    @col3 NVARCHAR(200),
    @col4 NVARCHAR(200)
    )
    RETURNS varchar(8000)
    AS
    BEGIN
        DECLARE @r varchar(8000)
        SELECT @r = ISNULL(@r +',','')+ [字段6]
        FROM tb
        WHERE 字段1=@col1 AND 字段2=@col2  
          AND 字段3=@col3 AND 字段4=@col4
        GROUP BY [字段6]
        RETURN @r
    END
    GOSELECT DISTINCT 字段1,字段2,字段3,字段4,
    dbo.f_str1(字段1,字段2,字段3,字段4) 字段5,
    dbo.f_str2(字段1,字段2,字段3,字段4) 字段6 
    FROM tb
    /*
    字段1 字段2 字段3 字段4 字段5 字段6
    A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格
    A00001 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
    A00001 检测外观 盐酸 应为无色无味 无色无味 不合格,合格
    A00002 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 不合格,合格
    */
      

  10.   

    CREATE FUNCTION F_COMBINESTR(@ID VARCHAR(8000)) 
    RETURNS VARCHAR(8000) 
    AS 
    BEGIN 
      DECLARE  @SQL VARCHAR(8000) 
      SET @SQL='' 
      SELECT @SQL=@SQL+',' + RESULT FROM (SELECT DISTINCT RESULT 
      FROM  Z_COA_DRUG_BODY ) AS T 
      WHERE STANDARD=@ID 
      RETURN STUFF(@SQL, 1, 1, '') 
    END少了东西,晕
      

  11.   

    /*
    Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)   Jul  9 2008 14:43:34   Copyright (c) 
    1988-2008 Microsoft Corporation  Enterprise Evaluation Edition on Windows NT 5.1 <X86> 
    (Build 2600: Service Pack 3) 
     愿和大家共同进步
    如有雷同、实属巧合
    ●●●●●2009-09-11 17:54:44.950●●●●●
     ★★★★★soft_wsx★★★★★
    */
    --
    if object_ID('TB') IS NOT NULL DROP TABLE TB
      create table tb(a nvarchar(20),b nvarchar(20),c nvarchar(20),d nvarchar(20),e nvarchar(20),f nvarchar(20))
    insert tb
    select
    'A00001   ', '检测浓度',    '盐酸',        '应在80%-99%',            '98%'     , '合格'  union all select  
    'A00001  ' , '检测浓度',    '盐酸',        '应在80%-99%' ,           '92%'    ,  '合格'  union all select  
    'A00001  ' , '检测浓度',    '盐酸' ,       '应在80%-99%'  ,          '93%'    ,  '合格'  union all select  
    'A00001 '  , '检测浓度',    '盐酸',        '应在80%-99%'   ,         '97%'    ,  '合格'  union all select  
    'A00001 '  , '检测外观',    '盐酸' ,       '应为无色无味'   ,       '无色无味' , '合格'     union all select  
    'A00001 '   ,'检测外观',    '盐酸'  ,      '应为无色无味'    ,      '无色无味' , '合格'  union all select  
    'A00001'    ,'检测外观',    '盐酸'   ,     '应为无色无味'      ,    '无色无味',  '不合格 ' union all select  
    'A00001'   , '检测浓度',    '硫酸'     ,   '应在80%-99%'      ,      '97%'   ,   '合格 ' union all select  
    'A00001'   , '检测浓度',    '硫酸'    ,    '应在80%-99%'       ,     '93%'   ,   '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'    ,    '应在80%-99%'        ,    '98% '  ,   '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'    ,    '应在80%-99%'         ,   '92% ' ,    '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'     ,   '应在80%-99%'          ,  '93% ' ,    '合格 ' union all select  
    'A00002'   , '检测浓度',    '盐酸'     ,   '应在80%-99%'          ,  '97%  ',    '不合格' 
    go
    if object_id('f_tb') is not null drop function f_tb
    go
      create function f_tb(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100),@flag int)
        returns nvarchar(4000)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         if @flag=0
              select @sql=@sql+N','+e from(select distinct e from tb where a=@a and b=@b and c=@c)a
         else 
              select @sql=@sql+N','+f from(select distinct f from tb where a=@a and b=@b and c=@c)a
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    goselect a,b,c,d,dbo.f_tb(a,b,c,0) as e,dbo.f_tb(a,b,c,1) as f from tb group by a,b,c,d 
    /*
    a b c d e f
    A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格 
    A00001    检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
    A00001  检测外观 盐酸 应为无色无味 无色无味 不合格 ,合格
    A00002 检测浓度 盐酸 应在80%-99% 92% ,93% ,97%  ,98%  不合格,合格 
    */合并函数
      

  12.   


    /*---------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2009-09-11 17:44:50
    --  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    Mar 29 2009 10:27:29 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
    --> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([字段1] nvarchar(6),[字段2] nvarchar(4),[字段3] nvarchar(2),[字段4] nvarchar(9),[字段5] nvarchar(4),[字段6] nvarchar(3))
    INSERT [tb]
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
    SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
    SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
    SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'不合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
    SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
    SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'不合格'
    GO
    --SELECT * FROM [tb]-->SQL查询如下:SELECT DISTINCT 字段1,字段2,字段3,字段4,
    STUFF((SELECT ','+字段5 FROM tb 
    WHERE 字段1=T.字段1 AND 字段2=T.字段2 AND 字段3=T.字段3 AND 字段4 =T.字段4 
    GROUP BY 字段5 FOR XML PATH('')),1,1,'') 字段5,
    STUFF((SELECT ','+字段6 FROM tb 
    WHERE 字段1=T.字段1 AND 字段2=T.字段2 AND 字段3=T.字段3 AND 字段4 =T.字段4 
    GROUP BY 字段6 FOR XML PATH('')),1,1,'') 字段6
    FROM tb t
    /*
    字段1 字段2 字段3 字段4 字段5 字段6
    A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格
    A00001 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
    A00001 检测外观 盐酸 应为无色无味 无色无味 不合格,合格
    A00002 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 不合格,合格
    */2005的写法.