如何在SQL Server 2005中找到表中多列的总和?

78

我有一个名为 Emp 的表,它包含以下行:

Emp_cd | Val1  | Val2  | Val3  | Total
-------+-------+-------+-------+-------
 1     | 1.23  | 2.23  | 3.43  | 
 2     | 23.03 | 12.23 | 2.92  |
 3     | 7.23  | 9.05  | 13.43 |
 4     | 03.21 | 78.23 | 9.43  |
我想求出Val1, Val2, Val3SUM并显示在Total列中。

您还可以将Total作为计算列。 - Paresh J
9个回答

139

简单:

SELECT 
   Val1,
   Val2,
   Val3,
   (Val1 + Val2 + Val3) as 'Total'
FROM Emp

或者,如果你只需要一行:

SELECT 
   SUM(Val1) as 'Val1',
   SUM(Val2) as 'Val2',
   SUM(Val3) as 'Val3',
   (SUM(Val1) + SUM(Val2) + SUM(Val3)) as 'Total'
FROM Emp

22
请注意,如果 Val 中有一个为 NULL,则第一个查询的总和将为 NULL。 - Abris
2
在第二个查询中,如果所有行的Valx都为null,那么这个查询将会出错。 - Isaac Kleinman
5
解决“null问题”的简单方法是添加一个isnull函数 - SUM(isnull(val1,0)) 表示“Val1”。 - Mordechai
1
@aF 动态列怎么样? - Prashant Pimpale
1
NVL(value, default value) can be used in hive instead of ISNULL - Safwan

49

你还必须意识到null记录:

SELECT  (ISNULL(Val1,0) + ISNULL(Val2,0) + ISNULL(Val3,0)) as 'Total'
FROM Emp

ISNULL 的用法:

ISNULL(col_Name, replace value)

4
如果您在使用mysql,则需要使用IFNULL()函数。 - Dexter

29

就像普通的SELECT一样吗?

SELECT 
   Val1, Val2, Val3,
   Total = Val1 + Val2 + Val3
FROM dbo.Emp

还是说你想确定总数并使用这些值更新表格?

UPDATE dbo.Emp
SET Total = Val1 + Val2 + Val3

如果您希望始终保持当前总数,您应该在表中拥有一个计算列:

ALTER TABLE dbo.Emp
ADD CurrentTotal AS Val1 + Val2 + Val3 PERSISTED

那么你将始终获得当前总数 - 即使值发生变化:

SELECT 
   Val1, Val2, Val3, CurrentTotal
FROM dbo.Emp

即使这个也可以正常工作,但我不能将您的答案标记为唯一的答案...感谢您的回复... - Tripati Subudhi

5

试试这个:

select sum(num_tax_amount+num_total_amount) from table_name;

0

问题要求每行输入一条记录,而不仅仅是一个总计。 - Rob Farley
问题是:如何找到多列的总和? - Diogo Rodrigues
是的,但它的意思是数学术语中的求和,即将事物相加。而不是获取聚合行。 - Rob Farley

0

需要在一个具有空值的Postgres数据库表上执行类似的工作。最终创建了一个函数,因为有太多的COALESCE需要添加。

CREATE OR REPLACE FUNCTION array_sum_float(float[])
    RETURNS float
AS
$$
DECLARE
    arrInts ALIAS FOR $1;
    sum int DEFAULT 0;
BEGIN
    FOR I IN ARRAY_LOWER(arrInts, 1)..ARRAY_UPPER(arrInts, 1)
        LOOP
            sum = sum + COALESCE(arrInts[I], 0);
        END LOOP;
    RETURN sum;
END;
$$
    LANGUAGE plpgsql;

SELECT array_sum_float(ARRAY [6,8, null, 2]);
SELECT array_sum_float(ARRAY [Val1, Val2, Val3]) from Emp;

0

你好,你可以使用一个简单的查询语句:

select emp_cd, val1, val2, val3,
(val1+val2+val3) as total 
from emp;

如果您需要插入新行,

insert into emp select emp_cd, val1, val2, val3,
(val1+val2+val3) as total 
from emp;

为了更新,

update emp set total = val1+val2+val3;

这将更新所有列


但是,如果val1、val2、val3中的任何一个值为null,则Total将为null,因此要么添加AND条件,要么使用ISNULL(column_name, replace_value)。 - Rupesh

-2
SELECT Emp_cd, Val1, Val2, Val3, SUM(Val1 + Val2 + Val3) AS TOTAL 
FROM Emp
GROUP BY Emp_cd, Val1, Val2, Val3

2
为什么需要添加“Group By”和“SUM”?你只需要将其中一个答案变慢即可!;) - shA.t

-3

使用触发器即可实现:

->CREATE TRIGGER trigger_name BEFORE INSERT ON table_name

FOR EACH ROW SET NEW.column_name3 = NEW.column_name1 + NEW.column_name2;

这只在您插入行到表中时生效,而不是在更新表时。为此,请创建另一个名称不同的触发器,并在上面的语法中使用UPDATE代替INSERT


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接