SQL Server中的表列动态求和
我在一个表中有以下数据,列为Col1、Col2、Col3、Col4、Col5。。。。。。。。。Col153 表中前四列中的示例数据:SQL Server中的表列动态求和,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在一个表中有以下数据,列为Col1、Col2、Col3、Col4、Col5。。。。。。。。。Col153 表中前四列中的示例数据: CREATE TABLE dbo.MyTable (LocaID VARCHAR(10),Col1 INT, Col2 INT,Col3 INT,Col4 INT) INSERT INTO dbo.MyTable values ('LV',2,6,4,7),('CH',4,8,3,1),('LV',1,3,9,3),('MC',7,0,5,4), ('LV',4,
CREATE TABLE dbo.MyTable (LocaID VARCHAR(10),Col1 INT, Col2 INT,Col3 INT,Col4 INT)
INSERT INTO dbo.MyTable values
('LV',2,6,4,7),('CH',4,8,3,1),('LV',1,3,9,3),('MC',7,0,5,4),
('LV',4,5,2,4),('MC',7,1,4,9),('MC',5,1,8,1),('CH',7,3,4,0),
('MC',2,5,7,3);
有153列需要单独求和。我使用下面的查询获取列列表:
-- This is to get the columns names
SELECT
COLUMN_NAME AS Col_Names
INTO #Column
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_NAME Like 'MyTable'
我尝试使用下面的查询动态求和:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(Col_Names)
FROM #Column
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query= 'SELECT
SUM('+@cols+')
FROM dbo.MyTable GROUP BY [LocaID]'
PRINT @query
当我打印结果以检查查询是否正确时,我得到以下结果:
SELECT SUM([Col1],[Col2],[Col3],[Col4],[LocaID])
FROM dbo.MyTable GROUP BY [LocaID]
这显然是不正确的。我需要的是:
SELECT
[LocaID],
SUM([Col1]) AS [Col1],
SUM([Col2]) AS [Col2],
SUM([Col3]) AS [Col3],
SUM([Col4]) AS [Col4]
FROM dbo.MyTable
GROUP BY [LocaID]
对于所有153列。表中只有一个LocaID。如果要对单个列进行求和,则需要更改
STUFF
函数。您需要为所有列应用SUM
函数,如下所示
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',SUM(' + QUOTENAME(Col_Names) + ')'
FROM #Column
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,1,'')
SET @query= 'SELECT [LocaID], '+@cols+'
FROM dbo.MyTable GROUP BY [LocaID]'
PRINT @query
非常感谢@Vad Soft,我调整了你的查询以满足我的需求
DECLARE @cols AS NVARCHAR(MAX),
@cols2 AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((
----------------------------------------------------------------------------------
SELECT DISTINCT CONCAT(',SUM(' + QUOTENAME(a.Col_Names) + ') AS ',' ',b.RN)
FROM #Column a
LEFT JOIN
(
SELECT
Col_Names AS RN
from #Column
where Col_Names <> 'LocaID' ) b ON b.RN=a.Col_Names
-------------------------------------------------------------------------------------
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)') ,1,1,'')
SET @cols2 =REVERSE(RIGHT(REVERSE(@cols),LEN(REVERSE(@cols))- CHARINDEX(',',REVERSE(@cols))))
--PRINT @cols2
SET @query= 'SELECT [LocaID],
'+@cols2+'
FROM dbo.MyTable GROUP BY [LocaID]'
--PRINT @cols
EXEC (@query)
---------------------------
DROP TABLE #Column
在填充@cols的查询中添加一个
其中col_命名为'LocaID'
,并在@query='选择LocaID,SUM(…
非常感谢您,我调整了您的查询,以获得我想要的以下查询
print @query
SELECT [LocaID],
SUM([Col1]) AS Col1,
SUM([Col2]) AS Col2,
SUM([Col3]) AS Col3,
SUM([Col4]) AS Col4
FROM dbo.MyTable GROUP BY [LocaID]