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

T-SQL如何将列求和为行?

  •  -1
  • Gordon  · 技术社区  · 7 年前

    我需要根据旧记录生成汇总表:

     Ref     Name   count11 count12     Name2   count21 count22     Name3     count31 count32 
    ========================================================================================
    1        item1       2      0      item2       0      1         item3       120    0  
    2        item1       32     3      item2       3      1         item3       3      5    
    3        item1       0      2      item2       0      0         item3       0      5    
    4        item1       12     1      item2       1      1         item3       1      1    
    5        item1       0      0      item2       0      0         item3       0      0    
    

    Ref     items       count1      count2
    ========================================
    1       item1       46          6
    2       item2       4           3
    3       item3       124         11
    

    如何存档此文件? 非常感谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Tim Biegeleisen    7 年前

    我们可以尝试执行pivot查询,但在为所有项创建单个逻辑列的CTE上:

    WITH cte AS (
        SELECT Name, count11 AS count1, count12 AS count2 FROM yourTable UNION ALL
        SELECT Name, count21, count22 FROM yourTable UNION ALL
        SELECT Name, count31, count32 FROM yourTable
    )
    
    SELECT
        Name AS items,
        SUM(count1) AS count1,
        SUM(count2) AS count2
    FROM cte
    GROUP BY
        Name
    ORDER BY
        Name;
    

    我漏掉了那封信 Ref 列,因为预期输出中的值实际上与原始数据没有任何关系。你可以用 ROW_NUMBER 如果您希望在输出中有一个序列,可以使用一些排序。

        2
  •  1
  •   Yogesh Sharma    7 年前

    我会用 APPLY

    SELECT tt.Ref, tt.items, SUM([count1]), SUM([count2])
    FROM table t CROSS APPLY
         ( VALUES (1, [Name],  [count11], [count12]), 
                  (2, [Name2], [count21], [count22]), 
                  (3, [Name3], [count31], [count32]) 
         ) tt(Ref, items, [count1], [count2])
    GROUP BY tt.Ref, tt.items;