如何对 SQL 服务器中的动态列求和?
How to sum dynamic columns in SQL Server?
假设我有一个包含 3 列的 table。在不指定列名的情况下,是否可能存在每列的总和?
是否有可能创建一个 table 具有列的动态名称,然后是每列的总和?
更新:这是我的示例。
首先,我进行查询并得到如下结果:
---------
| Col |
---------
| DLX |
| SUI |
| PRE |
| TWQ |
---------
每次行数可能不同,然后我创建了一个 table,其中的列来自上面的行,如下所示:
---------------------------------
| DLX | SUI | PRE | TWQ |
---------------------------------
然后我从另一个 table 填充数据 table。毕竟,我对每一列求和。因为我不知道列的确切名称,所以我需要每列的总和而不指定列的名称。
如果您的 table 很小(即 10 列),我会手动完成。但如果它像 20 多列,我会使用一些动态 sql.
要直接回答您的问题,是的,您可以使用动态 sql.
动态创建具有动态列名的 table
这是一种方法:
您可以使用 INFORMATION_SCHEMA.COLUMNS
View 获取所有列名并将它们放在临时文件中 table.
SELECT NAME INTO #COLUMNS
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = YourTable
接下来,创建一个临时文件 table 来存储您的总和。
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 并循环遍历新的 table 并使用总和值和 table你要的名字。
您应该能够使用上面已经提供的代码来做到这一点。
起初我想过旋转,但后来想出了这个:
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))
这将为您创建临时 table。
然后你可以用同样的方式插入table。
假设我有一个包含 3 列的 table。在不指定列名的情况下,是否可能存在每列的总和?
是否有可能创建一个 table 具有列的动态名称,然后是每列的总和?
更新:这是我的示例。 首先,我进行查询并得到如下结果:
---------
| Col |
---------
| DLX |
| SUI |
| PRE |
| TWQ |
---------
每次行数可能不同,然后我创建了一个 table,其中的列来自上面的行,如下所示:
---------------------------------
| DLX | SUI | PRE | TWQ |
---------------------------------
然后我从另一个 table 填充数据 table。毕竟,我对每一列求和。因为我不知道列的确切名称,所以我需要每列的总和而不指定列的名称。
如果您的 table 很小(即 10 列),我会手动完成。但如果它像 20 多列,我会使用一些动态 sql.
要直接回答您的问题,是的,您可以使用动态 sql.
动态创建具有动态列名的 table这是一种方法:
您可以使用 INFORMATION_SCHEMA.COLUMNS
View 获取所有列名并将它们放在临时文件中 table.
SELECT NAME INTO #COLUMNS
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = YourTable
接下来,创建一个临时文件 table 来存储您的总和。
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 并循环遍历新的 table 并使用总和值和 table你要的名字。
您应该能够使用上面已经提供的代码来做到这一点。
起初我想过旋转,但后来想出了这个:
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))
这将为您创建临时 table。
然后你可以用同样的方式插入table。