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

时间:2016-07-29 06:43:42

标签: sql sql-server tsql sql-server-2005

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

这是一种方法: 您可以使用INFORMATION_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和循环来循环遍历新表,并使用你想要的总和值和表名创建一个包含你想要的列名的临时表。

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

答案 1 :(得分: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))

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

然后您可以以相同的方式插入该表。