如何对 SQL Server 中的动态列求和?

Han*_*aka 3 sql t-sql sql-server sql-server-2005

假设我有一个包含 3 列的表。是否有可能在不指定列名称的情况下每列的总和?

是否可以创建一个带有列的动态名称的表,然后对每列求和?

更新:这是我的样本。首先,我进行查询并得到如下结果:

---------
|  Col  |
---------
|  DLX  |
|  SUI  |
|  PRE  |
|  TWQ  |
---------
Run Code Online (Sandbox Code Playgroud)

每次的行数可能不同,然后我创建一个表,其中包含来自上面行的列,如下所示:

---------------------------------
|  DLX  |  SUI  |  PRE  |  TWQ  |
---------------------------------
Run Code Online (Sandbox Code Playgroud)

然后我从另一个表中填充数据。毕竟,我对每一列求和。因为我不知道列的确切名称,所以我需要每列的总和而不指定列的名称。

Gov*_*Rai 5

如果您的表很小(即 10 列),我会手动完成。但是如果它像 20+ 列,我会使用一些动态 sql。

要直接回答您的问题,是的,您可以使用动态 sql 动态创建具有动态列名的表。

这是一种方法:您可以使用INFORMATION_SCHEMA.COLUMNSView 获取所有列名并将它们放入临时表中。

SELECT NAME INTO #COLUMNS 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = YourTable
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个临时表来存储您的总和。

CREATE TABLE #SUMS (
COLUMN_NAME NVARCHAR(MAX),
SUM_COLUMN INT
)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用动态 sql 和循环来对每列求和。

WHILE EXISTS(SELECT TOP 1 * FROM #COLUMNS)
    BEGIN
        DECLARE @COLUMN NVARCHAR(MAX) = (SELECT TOP 1 * FROM #COLUMNS)
        DECLARE @DYNAMICSQL NVARCHAR(MAX) = N'SELECT ' + @COLUMN + ' AS COLUMN_NAME, SUM(' + @COLUMN + ') FROM YourTable'

        INSERT INTO #SUMS
        EXEC SP_EXECUTESQL @DYNAMICSQL

        DELETE FROM #COLUMNS
        WHERE NAME = @COLUMN
    END
Run Code Online (Sandbox Code Playgroud)

然后,您将需要另一个动态 sql 和循环来循环遍历新表,并使用总和值和所需的表名创建一个具有所需列名的临时表。

您应该能够使用上面已经提供的代码来做到这一点。