如何在 SQL 中对多列求和

Posted

技术标签:

【中文标题】如何在 SQL 中对多列求和【英文标题】:How to sum multiple columns in SQL 【发布时间】:2018-03-01 06:21:50 【问题描述】:

我有一个包含 12 列数字数据的数据库 - 每个月一列。

列名是

Jan, Feb, Mar. Apr, May, Jun, Jul, Aug, Sep, Oct, Nov and Dec.

我知道如何编写代码来计算前 3 个月(1 月、2 月和 3 月)的总和并返回总计值。

SELECT Jan+Feb+Mar AS Total FROM MyData

问题:如何编写通用查询来给我前 N 个月的总和?

我需要编写代码来生成 SQL 语句还是有其他方法?

【问题讨论】:

我认为您需要编写代码来生成 SQL,因为 SQL 逻辑无法决定查询中包含哪些列。更好的设计可能是将您的月份分布在中。然后,您可以使用简单的WHERE 子句限制您想要的时间范围,而无需求助于动态 SQL。 您使用的是哪个DBMS 产品?后格雷斯?甲骨文? “SQL”只是一种查询语言,不是特定数据库产品的名称。 你有机会改变你的设计吗?如果你在两列(month, value) 和 12 行中有这个,那将是微不足道的。出现这些类型的问题是设计不是 SQL 模式的症状。 【参考方案1】:

我认为您需要动态 SQL 来自动生成前 N 个月的查询。但您也可以定义一个包含所有总和的视图,例如

CREATE VIEW sums AS (
    SELECT Jan AS total1,
    SELECT Jan + Feb AS total2,
    SELECT Jan + Feb + Mar AS total3,
    ...
    SELECT Jan + Feb + Mar + ... + Nov + Dec AS total12
    FROM yourTable
)

然后,您可以查询视图并访问您想要的任何金额。

【讨论】:

【参考方案2】:

您可以生成一个可以使用sp_executesql command执行的字符串

DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT #selectColumns# FROM tableName'

--- write your logic to get how many columns you need based on value of `N`
--- make their summation  as stringToReplace (i.e. = 'Jan + Feb + Mar ...')
--- and replace them with #selectColumns# in @query

EXECUTE(@query)

PS:如果您使用的是MSSQL Server 以外的数据库,您应该能够找到某种方法将字符串作为SQL 命令执行。

例如,对于 mysql,有prepare

PREPARE stmt1 FROM @query; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

对于 Oracle,您将拥有 EXEC SQL EXECUTE IMMEDIATE :query;

【讨论】:

如何知道 OP 使用的是哪个数据库? 由于 OP 没有提到,我认为这不是他要问的。我认为他遇到的主要问题是如何询问 sql server 选择哪些列 再一次,你怎么知道 OP 正在使用 SQL Server? 哦..好的...你是对的..您创建视图的方法更有意义...+1!【参考方案3】:

如果您使用的是SQL Server,那么您可以使用APPLY 运算符来生成月份序列。

SELECT
       SUM(a.Total) Totals 
FROM table t
CROSS APPLY (
        VALUES (1, 'Jan', Jan), (2, 'Feb', Feb), (3, 'Mar', Mar),
               ....
               (12, 'Dec', Dec)
)a(Seq, Months, Total)
WHERE a.Seq <= 3 -- pass Nos of Months to get the sum of Totals

【讨论】:

以上是关于如何在 SQL 中对多列求和的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pyspark 中对 spark 数据框中的多列求和?

在 Pyspark 中对多列进行累积求和的有效方法

如何在 sql 的循环中对函数求和?

如何在 SQL 中对每个 UniqueId 只求和一次?

如何在SQL中对相邻行进行分组并对数据求和

如何对sql查询引用组中的多列求和