我有一个像这样的标题表 -
id |小组| col1 | col2 | .... | col100
对于每个组,我想找出前5个列标题和列总和。
所以我期待
组| Top1 ColName | Top1 ColSum | Top2 ColName | Top2 ColSum | ...
我在R中编写了一个连接器并使用R来执行此操作。只是好奇,
1)是否可以直接在SQL中执行此操作?
2)是否可以执行自动group by...Sum
语句,这样我就不必输入每个列名?
感谢。
答案 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'的列。