• SQL Server 中多行多列连接成为单行单列( ,逗号分割)


    原始结构:
    Column1     Column2                                                                                              
    ----------- ----------
    1           A
    1           B
    2           C
    2           D
    2           E
    3           F
    查询效果:
    Column1     Column2                                                                 
    ----------- ------------------
    1           A,B
    2           C,D,E
    3           F

    即将 Column1 相同的行的 Column2 连成一列。
    不知如何描述此种用法,是否具有像交叉表相关的 Cross-Table 和 Pivot  之类的约定成熟的专业称谓?
    是否也可以称为另一种 Cross-Table ?
    此需求应该是常见的,网上也有许多DEMO,只是 CSDN 中频繁有新手提问,现简单实现一个DEMO,以便参考。

    -- 多行多列连接成为单行单列示例:需要一个自定义函数


    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzSample]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
    drop table [dbo].[VertToHorzSample]
    GO

    -- 建立测试数据
    CREATE TABLE VertToHorzSample(
        Column1 
    int,
        Column2 
    varchar(100)
    )

    GO

    INSERT INTO VertToHorzSample(Column1, Column2)
    SELECT 1'A'
    UNION ALL
    SELECT 1'B'
    UNION ALL
    SELECT 2'C'
    UNION ALL
    SELECT 2'D'
    UNION ALL
    SELECT 2'E'
    UNION ALL
    SELECT 3'F'

    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ConvertVertToHorz]'and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[ConvertVertToHorz]
    GO

    -- 建立辅助函数
    CREATE FUNCTION ConvertVertToHorz(@Col1Val int)
    RETURNS VARCHAR(8000)
    AS
        
    BEGIN 
            
    -- 实际项目中,应该考虑 @RetVal 是否会超过 8000 个字符
            DECLARE @RetVal varchar(8000)
            
    SET @RetVal = ''
            
    -- 通过递归 SELECT 连接指定列存储到临时变量中
            SELECT @RetVal = Column2 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
            
    -- 连接多列
            -- SELECT @RetVal = Column2 + ',' + Column3 + ',' + Column4 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
            
            
    -- 去掉尾巴的 , (逗号)
            IF LEN(@RetVal> 0
              
    SET @RetVal = LEFT(@RetValLEN(@RetVal- 1)    
            
    --PRINT @RetVal
            
            
    RETURN @RetVal
        
    END

    GO

    -- 测试
    SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2 FROM (SELECT DISTINCT Column1 FROM VertToHorzSample) t
    /*
    Column1     Column2                                                                 
    ----------- ------------------
    1           A,B
    2           C,D,E
    3           F
    */

    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzView]'and OBJECTPROPERTY(id, N'IsView'= 1)
    drop view [dbo].[VertToHorzView]
    GO

    -- 可以建立一个视图
    CREATE VIEW dbo.VertToHorzView
    AS
    SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2
    FROM (SELECT DISTINCT Column1 FROM dbo.VertToHorzSample) t

    GO

    -- 测试视图
    SELECT * FROM VertToHorzView
    /*
    Column1     Column2s                                                                                                                                                                                                                                                         
    ----------- -----------------
    1           A,B
    2           C,D,E
    3           F
    */
  • 相关阅读:
    Algs4-1.3链表实现泛型可迭代Stack
    Algs4-1.3链表实现科泛型可迭代Bag
    Algs4-1.3链表实现不定容泛型Queue不支持迭代
    Algs4-1.3不定容数组实现泛型栈支持迭代
    Algs4-1.3链表实现不定容泛型Stack不支持迭代
    Algs4-1.3不定容泛型栈(不可迭代)
    Algs4-1.3定容字符串栈
    Algs4-1.3定容泛型栈
    Algs4-1.3E.W.Dijkstra双栈算术表达式求值算法
    Algs4-1.2(非习题)可视化累加器
  • 原文地址:https://www.cnblogs.com/chengulv/p/2172633.html
Copyright © 2020-2023  润新知