代码之家  ›  专栏  ›  技术社区  ›  JonWay

创建自定义项将行拆分为逗号分隔的单列

  •  1
  • JonWay  · 技术社区  · 6 年前

    在下面的示例数据中,我想使用自定义项将行拆分为列。

    CREATE TABLE ##temp
    ([date] datetime,
        category varchar(3),
        amount money)
    insert into ##temp values ('1/1/2012', 'ABC', 1000.00)
    insert into ##temp values ('2/1/2012', 'DEF', 500.00)
    insert into ##temp values ('2/1/2012', 'GHI', 800.00)
    insert into ##temp values ('2/10/2012', 'DEF', 700.00)
    insert into ##temp values ('3/1/2012', 'ABC', 1100.00);
    

    我创建下面的函数

    CREATE FUNCTION dbo.Splitter(@Name NVARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
    DECLARE @cols AS NVARCHAR(MAX)
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(@Name) 
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    RETURN @cols
    END
    

    电流输出

    CatSplit
    [ABC]
    [DEF]
    [GHI]
    [DEF]
    [ABC]
    

    我想要的是(预期输出)

             CatSplit
    [ABC],[DEF],[GHI],[DEF],[ABC]
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Yogesh Sharma    6 年前

    为什么在这里需要函数您可以不使用函数:

    SELECT STUFF((SELECT  ',' + QUOTENAME(t.category ) 
                  from #temp t
                  FOR XML PATH(''), TYPE
                 ).VALUE('.', 'NVARCHAR(MAX)'), 1, 1, ''
                ) AS CatSplit
    

    编辑: 如果要将此用作数据透视或其他操作的列名,则可以定义一个变量&在代码中到处使用它,不需要使用函数。

    DECLARE @cols AS NVARCHAR(MAX)
    
    SELECT @cols = STUFF((SELECT  ',' + QUOTENAME(t.category ) 
                          FROM #temp t
                          FOR XML PATH(''), TYPE
                         ).VALUE('.', 'NVARCHAR(MAX)'), 1, 1, ''
                        )