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

如何对SQL Server中的动态列求和?,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,假设我有一个有3列的表。是否有可能在不指定列名称的情况下对每列求和 是否有可能创建一个列的动态名称表,然后创建每个列的总和 更新:这是我的样本。 首先,我进行查询,得到如下结果: --------- | Col | --------- | DLX | | SUI | | PRE | | TWQ | --------- --------------------------------- | DLX | SUI | PRE | TWQ | -----------

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

是否有可能创建一个列的动态名称表,然后创建每个列的总和

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

---------
|  Col  |
---------
|  DLX  |
|  SUI  |
|  PRE  |
|  TWQ  |
---------
---------------------------------
|  DLX  |  SUI  |  PRE  |  TWQ  |
---------------------------------
每次的行数可能不同,然后我创建一个表,其中包含上面行中的列,如下所示:

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

如果您的表很小(即10列),我只需要手动操作。但如果是20多列,我会使用一些动态sql

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

这里有一种方法: 您可以使用
INFORMATION\u SCHEMA.COLUMNS
View获取所有列名并将它们放入临时表中

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和循环来循环新表,并使用所需的总和值和表名创建一个具有所需列名的临时表


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

起初我考虑过旋转,但后来想到了以下方法:

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
以查看以下结果):

这将为您创建一个临时表


然后你可以用同样的方法在表中插入

您的意思是要创建包含各个列总和的列名吗?(即第1列总和=25,第1列名称=
第25列
)。如果只有3列,最好手工编写查询。请提供示例输入和预期结果result@TheGameiswar请参考我的新更新问题。lol在这里不一致。SQL必须用大写字母编写。具有
创建表
的零件格式不正确。如果你拒绝我的编辑-请自己格式化。我的意思是在句子中使用动态三次,而不是嘲笑OP。我将删除它。你是对的。我完全忘了。