找到包含数百个变量的最大列总和

时间:2014-06-10 23:06:57

标签: sql sql-server

我有一个像这样的标题表 -

  

id |小组| col1 | col2 | .... | col100

对于每个组,我想找出前5个列标题和列总和。

所以我期待

  

组| Top1 ColName | Top1 ColSum | Top2 ColName | Top2 ColSum | ...

我在R中编写了一个连接器并使用R来执行此操作。只是好奇,
1)是否可以直接在SQL中执行此操作? 2)是否可以执行自动group by...Sum语句,这样我就不必输入每个列名?

感谢。

1 个答案:

答案 0 :(得分:2)

你可以通过UNPIVOT接近这个......

例如(已省略):

SELECT group, colName, colValue
FROM t
UNPIVOT
(
   colValue for colName IN (col1, col2, col3...)
) up

现在你可以按如下方式使用它:

WITH Unpivoted AS
(
    SELECT group, colName, colValue
    FROM t
    UNPIVOT
    (
       colValue for colName IN (col1, col2, col3...)
    ) up
)

, GroupColumnSums AS
(
    SELECT group, colName, SUM(colValue) AS colSum
    FROM Unpivoted
    GROUP BY group, colName
)

, RankedColumnSums AS
(
    SELECT group, colName, colSum, ROW_NUMBER() OVER (PARTITION BY group, colName ORDER BY colSum DESC) AS sumRank
    FROM GroupColumnSums
)

SELECT group, colName, colSum, sumRank
FROM RankedColumnSums
WHERE sumRank <= 5

但是,我不认为您可以轻松地重新编辑它,以便您可以{Top1ColName,Top1ColSum},{Top2ColName,Top2ColSum}

SQL可以PIVOT,但它只能在一列上执行。所以我们要做的就是将colName和colSum“组合”成一个(例如colName +'|'+ CONVERT(VARCHAR(30),colSum),然后转向,然后将结果“解包”回单独的'name'和'sum'的列。