项目信息表A  项目编号: 项目名称:  城市              样本量      PM          时间
                gz_234        xxxx    a                  2880     b             2009-12-12   流程表B      项目编号     流程ID   流程名称        负责人    是否启动   
                 gz_234       a1       g              aa         1
                 gz_234       a2       b              bb         0
                 gz_234       a3       c              cc         1  两张表合并 输出这样的信息:    项目编号     项目基本信息(这里其实就是一列)                         流程基本信息(是否启动来判断,是1则可以)
   gz_234  项目名称: xxxx ;城市 :a;样本量:2880;时间:2009-12-29; PM b;  流程ID a1; a2 ;a3  流程名称 g;b;c 负责人:aa;bb;cc                 

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-12-28 20:14:20
    -- 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)
    --
    ----------------------------------------------------------------
    --> 测试数据:[A]
    if object_id('[A]') is not null drop table [A]
    go 
    create table [A]([项目编号] varchar(6),[项目名称] varchar(4),[城市] varchar(1),[样本量] int,[PM] varchar(1),[时间] datetime)
    insert [A]
    select 'gz_234','xxxx','a',2880,'b','2009-12-12'
    --> 测试数据:[B]
    if object_id('[B]') is not null drop table [B]
    go 
    create table [B]([项目编号] varchar(6),[流程ID] varchar(2),[流程名称] varchar(1),[负责人] varchar(2),[是否启动] int)
    insert [B]
    select 'gz_234','a1','g','aa',1 union all
    select 'gz_234','a2','b','bb',0 union all
    select 'gz_234','a3','c','cc',1
    --------------开始查询--------------------------
    ;with f as
    (
    select a.*,b.流程ID,b.流程名称,b.负责人,b.是否启动 from a join b on a.项目编号=b.项目编号
    )
     select 
        项目编号,项目名称,城市,样本量,PM,时间,
        [流程ID]=stuff((select ','+[流程ID] from f t where 项目编号=f.项目编号 for xml path('')), 1, 1, ''),
        [负责人]=stuff((select ','+[负责人] from f t where 项目编号=f.项目编号 for xml path('')), 1, 1, '')
    from
        f
    group by
        项目编号,项目名称,城市,样本量,PM,时间
        
    ----------------结果----------------------------
    /* 项目编号   项目名称 城市   样本量         PM   时间                      流程ID                                                                                                                                                                                                                                                             负责人
    ------ ---- ---- ----------- ---- ----------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    gz_234 xxxx a    2880        b    2009-12-12 00:00:00.000 a1,a2,a3                                                                                                                                                                                                                                                         aa,bb,cc(1 行受影响)
    */
      

  2.   

    ---2000的参考:
    合并列值 
    --*******************************************************************************************
    表结构,数据如下: 
    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. 旧的解决方法(在sql server 2000中只能用函数解决。) 
    --=============================================================================
    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 
    --1. 创建处理函数 
    CREATE FUNCTION dbo.f_strUnite(@id int) 
    RETURNS varchar(8000) 
    AS 
    BEGIN 
        DECLARE @str varchar(8000) 
        SET @str = '' 
        SELECT @str = @str + ',' + value FROM tb WHERE id=@id 
        RETURN STUFF(@str, 1, 1, '') 
    END 
    GO 
    -- 调用函数 
    SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id 
    drop table tb 
    drop function dbo.f_strUnite 
    go
    /* 
    id          value      
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc 
    (所影响的行数为 2 行) 
    */ 
    --===================================================================================
    2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。) 
    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 
    -- 查询处理 
    SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY( 
            SELECT [values]= STUFF(REPLACE(REPLACE( 
                ( 
                    SELECT value FROM tb N 
                    WHERE id = A.id 
                    FOR XML AUTO 
                ), ' <N value="', ','), '"/>', ''), 1, 1, '') 
    )N 
    drop table tb /* 
    id          values 
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 行受影响) 
    */ --SQL2005中的方法2 
    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 select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '') 
    from tb 
    group by id /* 
    id          values 
    ----------- -------------------- 
    1          aa,bb 
    2          aaa,bbb,ccc (2 row(s) affected) */ drop table tb 
      

  3.   

    create table [A]([项目编号] varchar(6),[项目名称] varchar(4),[城市] varchar(1),[样本量] int,[PM] varchar(1),[时间] datetime)
    insert [A]
    select 'gz_234','xxxx','a',2880,'b','2009-12-12'
    create table [B]([项目编号] varchar(6),[流程ID] varchar(2),[流程名称] varchar(1),[负责人] varchar(2),[是否启动] int)
    insert [B]
    select 'gz_234','a1','g','aa',1 union all
    select 'gz_234','a2','b','bb',0 union all
    select 'gz_234','a3','c','cc',1
    gocreate function dbo.f_str1(@项目编号 varchar(6)) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ';' + cast(流程名称 as varchar) from B where 项目编号 = @项目编号
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go
    create function dbo.f_str2(@项目编号 varchar(6)) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ';' + cast(流程ID  as varchar) from B where 项目编号 = @项目编号
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go
    create function dbo.f_str3(@项目编号 varchar(6)) returns varchar(100)
    as
    begin
        declare @str varchar(1000)
        set @str = ''
        select @str = @str + ';' + cast(负责人 as varchar) from B where 项目编号 = @项目编号
        set @str = right(@str , len(@str) - 1)
        return @str
    end
    go--调用函数
    select m.项目编号 , 
           项目基本信息 = '项目编号:' + m.项目编号 + ';' +
                         '城市:' + m.城市 + ';' + 
                         '样本量:' + cast(m.样本量 as varchar) + ';' +
                         '时间:' + convert(varchar(10),时间,120) + ';' +
                         'PM:' + PM + ';', 
           n.流程基本信息 from a m,
    (select 项目编号 , 流程基本信息='流程ID:'+dbo.f_str1(项目编号)+' 流程名称:'+dbo.f_str2(项目编号)+' 负责人:'+dbo.f_str3(项目编号) from B group by 项目编号) n
    where m.项目编号 = n.项目编号drop table a , b
    drop function dbo.f_str1
    drop function dbo.f_str2
    drop function dbo.f_str3/*
    项目编号   项目基本信息                                                                             流程基本信息                                                                                                                                                                                                                                                           
    ------ ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    gz_234 项目编号:gz_234;城市:a;样本量:2880;时间:2009-12-12;PM:b;                                      流程ID:g;b;c 流程名称:a1;a2;a3 负责人:aa;bb;cc(所影响的行数为 1 行)
    */