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

3
假设我有一张有三列的表格,是否可以在不指定列名的情况下对每列进行求和?
而且是否可以创建一个具有动态列名的表格,并对每列进行求和?
更新:这是我的示例。首先,我进行查询并获得以下结果:
---------
|  Col  |
---------
|  DLX  |
|  SUI  |
|  PRE  |
|  TWQ  |
---------

每次行数可能会不同,然后我会根据上面的行创建一个表格,如下所示:

---------------------------------
|  DLX  |  SUI  |  PRE  |  TWQ  |
---------------------------------

然后我从另一个表中填充数据到该表中。最后,我对每一列进行求和。因为我不知道列的确切名称,所以需要在不指定列名的情况下对每一列求和。


你的意思是想创建包含各个列之和的列名吗?(例如,列1之和=25,列1名称=column 25)。 - Govind Rai
1
如果只有3列,最好手写查询。 - gofr1
输入示例:Hello World!预期结果:你好,世界! - TheGameiswar
@TheGameiswar 请参考我的新更新问题。 - Hanaka
2个回答

6
如果您的表很小(例如10列),我建议您手动完成。但是如果它有20多个列,我建议使用一些动态SQL。
直接回答您的问题,是的,您可以使用动态SQL动态创建具有动态列名的表。
这是一种方法: 您可以使用 INFORMATION_SCHEMA.COLUMNS 视图获取所有列名并将其放入临时表中。
SELECT NAME INTO #COLUMNS 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = YourTable

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

CREATE TABLE #SUMS (
COLUMN_NAME NVARCHAR(MAX),
SUM_COLUMN INT
)

您可以使用动态 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

然后,您需要另一个动态SQL语句和循环来遍历新表,并使用所需的列名、sum值和表名创建一个临时表。

您应该可以使用上面已提供的代码完成此操作。


lol 不应该出现在这里。SQL 必须用大写字母编写。带有 CREATE TABLE 的部分格式不正确。如果您拒绝我的编辑,请自行进行格式化。 - gofr1
我的意思是在句子中使用“dynamic”这个词三次,而不是嘲笑OP。我会把它删除的。你说得对,我完全忘记了。 - Govind Rai

0

一开始我考虑过枢轴,但后来想到了这个方法:

DECLARE @Table TABLE (  --Table to generate input you need
    [Col] nvarchar(3)
)
DECLARE @query nvarchar(max) -- a variable that will store dynamic SQL query
DECLARE @table_name nvarchar(max) = 'Temp' --A name of table to create

INSERT INTO @Table VALUES
('DLX'),
('SUI'),
('PRE'),
('TWQ')

SELECT @query = ISNULL(@query,'CREATE '+@table_name+' TABLE (') + QUOTENAME([Col]) + ' nvarchar(max),'
FROM @Table

SELECT @query = SUBSTRING(@query,1,LEN(@query)-1) +')'

EXEC sp_executesql @query 

这将执行一个查询(PRINT @query 可查看下方结果):

CREATE Temp TABLE ([DLX] nvarchar(max),[SUI] nvarchar(max),[PRE] nvarchar(max),[TWQ] nvarchar(max))

这将为您创建一个临时表。

然后,您可以以相同的方式在该表中插入数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接