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

     
  • 相关阅读:
    Maven3路程(五)用Maven创建Hibernate项目
    Eclipse中通过Hibernate Tools插件实现从数据库逆向生成Hibernate带注解的实体类
    Maven3路程(三)用Maven创建第一个web项目(1)
    jquery下载所有版本(实时更新)
    Oracle读取Blob数据-通过hibernate
    使用以下代码可以插入BLOB类型的图片或pdf文档到Oracle数据库中:
    Intellij IDEA系列 --GIT的初步使用
    java.lang.OutOfMemoryError GC overhead limit exceeded原因分析及解决方案
    idea如何安装使用jetty runner
    IntelliJ IDEA下SVN的配置及使用说明
  • 原文地址:https://www.cnblogs.com/mikemao/p/1325296.html
Copyright © 2011-2022 走看看