SQL总和为3列

时间:2011-07-02 20:35:41

标签: sql

我知道这个问题似乎有点基本但我想确保我得到正确的语法,因为这行代码会经常运行:

我希望对表格“字母表”中的A,B和C列汇总,这些行包含在我的IN子句中。

我会这样做,但如果可能的话我想要确认:

SELECT SUM(A + B + C) as "subtotal" FROM alphabet WHERE id IN ('1','5','378');

3 个答案:

答案 0 :(得分:9)

如果id不是字符串,则不应引用这些值。

SELECT SUM(A + B + C) as "subtotal" FROM alphabet WHERE id IN (1,5,378);

这应该有用,但可能有一个非显而易见的后果。如果任何行A不为空且其中一个为空,则该行将退出求和,因为null加上任何其他值为null,并且SUM运算符忽略空值。因此,写作可能更安全:

SELECT SUM(A) + SUM(B) + SUM(C) as "subtotal" FROM alphabet WHERE id IN (1,5,378);

这会遇到同样的潜在问题,但不太可能发生,因为整个列必须为空。如果您仍然担心,有各种方言特定的方法来抵御这个问题。最便携的是痛苦的冗长:

SELECT SUM(
      CASE
        WHEN A IS NULL
        THEN 0
        ELSE A
      END
      +
      CASE
        WHEN B IS NULL
        THEN 0
        ELSE B
      END
      +
      CASE
        WHEN c IS NULL
        THEN 0
        ELSE C
      END
    ) as "subtotal"
FROM alphabet
WHERE id IN (1,5,378);

答案 1 :(得分:1)

“经常跑步”表明性能将成为一个问题。如果这是真的,请确保id上有索引。如果它是主键,默认情况下它会有一个索引。

如果您没有索引,您最终会进行表扫描 - 检查每一行。随着表格规模的增长,性能会变差。

对您的查询执行EXPLAIN PLAN,并确保在任何地方都看不到TABLE SCAN。

答案 2 :(得分:0)

declare 
    @a int = 0, 
    @b int = 5,
    @c int = NULL

select 
    ISNULL(@a, 0) + ISNULL(@b, 0) + ISNULL(@c, 0)