如何在 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 中对多列求和的主要内容,如果未能解决你的问题,请参考以下文章