【问题标题】:Dynamically sum table columns in SQL ServerSQL Server 中的动态汇总表列
【发布时间】:2020-02-24 09:38:17
【问题描述】:

我在一个表中有以下数据,其中包含 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,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。

【问题讨论】:

  • 在填充@cols的查询中添加WHERE col_Names <>'LocaID',并在@query = 'SELECT LocaID, SUM(....中添加固定部分

标签: sql sql-server tsql


【解决方案1】:

如果你想SUM 单个列,你需要改变你的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

【讨论】:

  • 非常感谢,我调整了您的查询以通过下面的查询获得我想要的结果
【解决方案2】:

非常感谢@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

输出

 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多