• SQL SERVER:在SQL中分类合并数据行


     -- =============================================================================
    --
     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)
    */

     
  • 相关阅读:
    Hdu 5445 Food Problem (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online)
    Hdu 3966 Aragorn's Story (树链剖分 + 线段树区间更新)
    大数模板 (C ++)
    后缀数组 DC3构造法 —— 详解
    后缀数组 (倍增法) 个人理解
    Hdu 2888 Check Corners (二维RMQ (ST))
    Marriage Match IV---hdu3416(spfa + Dinic)
    The Shortest Path in Nya Graph---hdu4725(spfa+扩点建图)
    Tram---poj1847(简单最短路)
    昂贵的聘礼---poj1062(最短路)
  • 原文地址:https://www.cnblogs.com/mikemao/p/1325296.html
Copyright © 2020-2023  润新知