zoukankan      html  css  js  c++  java
  • 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)
    */

  • 相关阅读:
    【C-数据类型 常量 变量】
    【OC简介-类和对象】
    【ios面试总结】
    【OC基础语法考试】
    【C-01关键字】
    UI3
    ui2
    UI
    C++使用shell命令
    字典
  • 原文地址:https://www.cnblogs.com/xuzhiwei/p/3213633.html
Copyright © 2011-2022 走看看