表 TABtable TAB
a   b    c
------------------
1   p    2009年3月
2   p    2009年4月
3   b    2009年8月
4   d    2009年1月
5   d    2009年2月
写个sql
得到下面的表
a   b    c
------------------
1   p    2009年3月、2009年4月
3   b    2009年8月
4   d    2009年1月、2009年2月

解决方案 »

  1.   


    表结构,数据如下: 
    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中只能用函数解决。) 
    --1. 创建处理函数 
    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 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, value = dbo.f_str(id) FROM tb GROUP BY id drop table tb 
    drop function dbo.f_str /* 
    id          value      
    ----------- ----------- 
    1          aa,bb 
    2          aaa,bbb,ccc 
    (所影响的行数为 2 行) 
    */ --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 --创建一个合并的函数 
    create function f_hb(@id int) 
    returns varchar(8000) 
    as 
    begin 
      declare @str varchar(8000) 
      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 distinct id ,dbo.f_hb(id) as value from tb drop table tb 
    drop function dbo.f_hb /* 
    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.   


    if object_ID('TB') IS NOT NULL DROP TABLE TB
      create table tb(id int,corpname varchar(10),salebrand varchar(10))
    insert tb
    select  
    1,   'p',    '2009年3月'  union all select
    2,   'p',    '2009年4月'  union all select
    3,   'b',    '2009年8月'  union all select
    4,   'd',    '2009年1月' union all select
    5,   'd',    '2009年2月'
    go
    if object_id('f_tb') is not null drop function f_tb
    go
      create function f_tb(@corpname nvarchar(100))
        returns nvarchar(100)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+salebrand from tb where corpname=@corpname
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    goselect id,corpname,dbo.f_tb(corpname) as 结果 from tb a
      where
      not exists(select 1 from tb where corpname=a.corpname and id>a.id)
     /*
     id corpname 结果
    2 p 2009年3月,2009年4月
    3 b 2009年8月
    5 d 2009年1月,2009年2月
    */
      

  3.   

    /*
    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 16:40:20.233●●●●●
     ★★★★★soft_wsx★★★★★
    */
    --select GETDATE()
    select a.*,b.*
      from vip a left join (
              SELECT * 
                FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0',
                'Data Source="c:\book1.xls";User ID=;Password=;Extended properties=Excel 8.0')...pos$ 
               )b on a.id=b.id
                   --"c:\book1.xls"  为文件所在路径
      
    --2
    SELECT * into #pos
                FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0',
                'Data Source="c:\book1.xls";User ID=;Password=;Extended properties=Excel 8.0')...pos$       
                       
    select a.*,b.*
      from vip a left join #pos b
             on a.id=b.id这才是对的
      

  4.   

    /*
    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(id int,corpname varchar(10),salebrand varchar(10))
    insert tb
    select  
    1,   'p',    '2009年3月'  union all select
    2,   'p',    '2009年4月'  union all select
    3,   'b',    '2009年8月'  union all select
    4,   'd',    '2009年1月' union all select
    5,   'd',    '2009年2月'
    go
    if object_id('f_tb') is not null drop function f_tb
    go
      create function f_tb(@corpname nvarchar(100))
        returns nvarchar(100)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+salebrand from tb where corpname=@corpname
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    goselect id,corpname,dbo.f_tb(corpname) as 结果 from tb a
      where
      not exists(select 1 from tb where corpname=a.corpname and id<a.id)
     /*
    id corpname 结果
    1 p 2009年3月,2009年4月
    3 b 2009年8月
    4 d 2009年1月,2009年2月
    */if object_ID('TB') IS NOT NULL DROP TABLE TB
      create table tb(id int,corpname varchar(10),salebrand varchar(10))
    insert tb
    select  
    1,   'p',    '2009年3月'  union all select
    2,   'p',    '2009年4月'  union all select
    3,   'b',    '2009年8月'  union all select
    4,   'd',    '2009年1月' union all select
    5,   'd',    '2009年2月'
    go
    if object_id('f_tb') is not null drop function f_tb
    go
      create function f_tb(@corpname nvarchar(100))
        returns nvarchar(100)
        as
       begin
         declare @sql nvarchar(4000)
         set @sql=N''
         select @sql=@sql+N','+salebrand from tb where corpname=@corpname
         set @sql=stuff(@sql,1,1,N'')
         return(@sql)
       end
    goselect id,corpname,dbo.f_tb(corpname) as 结果 from tb a
      where
      not exists(select 1 from tb where corpname=a.corpname and id<a.id)
     /*
    id corpname 结果
    1 p 2009年3月,2009年4月
    3 b 2009年8月
    4 d 2009年1月,2009年2月
    */又错了