dobear

Nerver try, nerver know

用户操作
[即时聊天] [发私信] [加为好友]
dobearID:dobear_0922
8095次访问,排名13505(-7),好友82人,关注者158人。
dobear
dobear_0922的文章
原创 14 篇
翻译 0 篇
转载 3 篇
评论 26 篇
最近评论
救援隊募集:アダルトエロ不倫
guoyz_1:顶你
guoyz_1:顶你
guoyz_1:顶你
guoyz_1:顶你
文章分类
收藏
    相册
    bear
    SQL
    Leo——感谢生活!(RSS)
    天道酬勤(RSS)
    石头(RSS)
    近身剪(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 SQL中合并多行记录的方法总汇收藏

    新一篇: 一个典型的Sql Server 触发器应用 | 旧一篇: SQL2005下使用CTE的一个示例

     

    -- =============================================================================
    --
     Title: 在SQL中分类合并数据行
    --
     Author: dobear        Mail(MSN): dobear_0922@hotmail.com
    --
     Environment: Vista + SQL2005
    --
     Date: 2008-04-22
    --
     =============================================================================

    --1. 创建表,添加测试数据
    CREATE TABLE tb(id int[value] varchar(10))
    INSERT tb 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 tb
    /*
    id          value
    ----------- ----------
    1           aa
    1           bb
    2           aaa
    2           bbb
    2           ccc

    (5 row(s) affected)
    */



    --2 在SQL2000只能用自定义函数实现
    --
    --2.1 创建合并函数fn_strSum,根据id合并value值
    GO
    CREATE FUNCTION dbo.fn_strSum(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        
    DECLARE @values varchar(8000)
        
    SET @values = ''
        
    SELECT @values = @values + ',' + value FROM tb WHERE id=@id
        
    RETURN STUFF(@values11'')
    END
    GO

    -- 调用函数
    SELECT id, VALUE = dbo.fn_strSum(id) FROM tb GROUP BY id
    DROP FUNCTION dbo.fn_strSum

    ----2.2 创建合并函数fn_strSum2,根据id合并value值
    GO
    CREATE FUNCTION dbo.fn_strSum2(@id int)
    RETURNS varchar(8000)
    AS
    BEGIN
        
    DECLARE @values varchar(8000)    
        
    SELECT @values = isnull(@values + ','''+ value FROM tb WHERE id=@id
        
    RETURN @values
    END
    GO

    -- 调用函数
    SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUP BY id
    DROP FUNCTION dbo.fn_strSum2


    --3 在SQL2005中的新解法
    --
    --3.1 使用OUTER APPLY
    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="'','), '"/>'''), 11'')
    )N

    ----3.2 使用XML
    SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 11'')
    FROM tb
    GROUP BY id

    --4 删除测试表tb
    drop table tb

    /*
    id          values
    ----------- --------------------
    1           aa,bb
    2           aaa,bbb,ccc

    (2 row(s) affected)
    */

     

    发表于 @ 2008年04月22日 10:16:00|评论(loading...)|编辑

    新一篇: 一个典型的Sql Server 触发器应用 | 旧一篇: SQL2005下使用CTE的一个示例

    评论

    #davide520 发表于2008-04-24 08:20:41  IP: 121.15.143.*
    谢谢,学习拉.
    #haidy 发表于2008-04-24 10:12:29  IP: 124.64.105.*
    我水平不够,好多地方看不明白,还得仔细想想!
    #leafinsight 发表于2008-06-18 17:16:42  IP: 219.142.122.*
    强的一塌糊涂
    #xingsheng824 发表于2008-09-08 16:47:05  IP: 60.209.227.*
    make a collection
    #救援隊募集 发表于2008-12-05 12:44:38  IP: 121.93.14.*
    アダルトエロ不倫
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © dobear