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

将一行值转换为多列

  •  1
  • user3007447  · 技术社区  · 7 年前

    这是我的问题:

    select
        t1.id
        ,t1.name
        ,t3.description
        ,t3.amount
    from
        table1 (nolock) t1
    join 
        table2 (nolock) t2 on t1.t2_id = t2.id
    join 
        table3 (nolock) t3 on t2.t3_id = t3.id
    

    结果:

    t1.id | t1.name  | t3.description  | t3.amount
    ------+----------+-----------------+----------
     1    | TEST     | TEST DESC. 1    |   100
     1    | TEST     | TEST DESC. 2    |   200
    

    我希望我的结果是:

    t1.id | t1.name  | TEST DESC. 1  | TEST DESC. 2
    ------+----------+---------------+--------------    
      1   | TEST     |    100        |    200
    

    t3.description中的值并不总是相同的。可能有很多不同的。

    我一直在试着研究枢轴,但我似乎无法将我的头绕在它周围。我提供的查询是一个更大查询的非常简化的版本,但是如果我能让它工作,我应该能够使它适用于更大的查询。

    谢谢大家的建议。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Rajat Jaiswal    7 年前

    动态轴

     DROP TABLE #source
        CREATE  TABLE #source (ID INT, name VARCHAR(100),Description VARCHAR(100), amount int)
    
    INSERT INTO #source( Id,name, description, amount) 
    VALUES ( 1              ,'TEST',                'TEST DESC. 1',       100),
     (1    ,    'TEST',          'TEST DESC. 2'     ,      200),
      (1    ,    'TEST',          'TEST DESC. 3'     ,      300)
    
    
    DECLARE @cols AS NVARCHAR(MAX),
            @query AS NVARCHAR(MAX)
    
    SELECT @cols = STUFF
            (
              (
                SELECT ',' + QUOTENAME(Description)
                FROM #source
                GROUP BY Description
    
                ORDER BY Description
                FOR XML PATH(''), TYPE
              ).value('.', 'NVARCHAR(MAX)'),
              1,1,''
            );
    
    SET @query = 'SELECT *
                  FROM
                  (
                    SELECT Id,name, Description, amount
                    FROM #source
                 ) x
                 PIVOT
                 (
                    SUM(AMOUNT)
                    FOR description IN (' + @cols + ')
                 ) p ';
    
                 prINT @qUERY
    EXECUTE(@query);