Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找包含数百个变量的最大列和_Sql_Sql Server - Fatal编程技术网

Sql 查找包含数百个变量的最大列和

Sql 查找包含数百个变量的最大列和,sql,sql-server,Sql,Sql Server,我有一张这样的桌子- id |组| col1 | col2 | | col100 对于每个组,我想找出前5个列标题和列总和 所以我期待着 组| Top1 ColName | Top1 ColSum | Top2 ColName | Top2 ColSum | 我已经在R中编写了一个连接器,并使用R实现了这一点。只是好奇, 1是否可以直接在SQL中执行此操作? 2是否可以执行自动GROUPBY…Sum语句,这样我就不必键入每个列名 谢谢。您可以使用UNPIVOT 例如,省略: SELECT gro

我有一张这样的桌子-

id |组| col1 | col2 | | col100

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

所以我期待着

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

我已经在R中编写了一个连接器,并使用R实现了这一点。只是好奇, 1是否可以直接在SQL中执行此操作? 2是否可以执行自动GROUPBY…Sum语句,这样我就不必键入每个列名


谢谢。

您可以使用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可以透视,但是它只能在一列上透视。因此,我们要做的是将colName和colSum组合成一个,例如colName+“|”+CONVERTVARCHAR30,colSum,以它为轴心,然后将结果解压回“name”和“sum”的单独列中。

你不能只选择group,当sumRank=1时选择MAXCASE,然后选择colName ELSE作为Top1ColName,MAXCASE当sumRank=1时,colSum否则0结束为Top1ColSum…我想你是对的,那就可以了我会用SUM而不是MAX来表示colSum,否则它不能用负数values@MarkSowul:或者您仍然可以使用MAX,但可以将ELSE 0替换为ELSE NULL,或者干脆一起省略ELSE子句。这很不礼貌。NULL被认为是最小值这一点并不明显,将NULL与值进行比较是相当不自然的,因为它的行为与其他与NULL的比较不同,例如5