SQL:包含 NULLS 的两列的总和?

Posted

技术标签:

【中文标题】SQL:包含 NULLS 的两列的总和?【英文标题】:SQL: Sum of two columns containing NULLS? 【发布时间】:2021-07-07 16:04:41 【问题描述】:

我想将两列相加得到第三列。如果一行的两列都有NULL,我希望第三列有NULL,而不是0。原因是因为我想获得第三列的平均值,而 0 会改变该平均值。

| Value1 | Value2 | Value3 |
|--------|--------|--------|
| 10     | NULL   | 10     |
| 20     | NULL   | 20     |
| NULL   | NULL   | NULL   |
| 20     | 30     | 50     |
| NULL   | NULL   | NULL   |

我尝试了以下方法,但它们都为NULL 行提供了0。实现这一目标的最佳方法是什么?

CREATE TABLE #AMOUNTS (
    Value1 INT,
    Value2 INT
)

INSERT INTO #AMOUNTS VALUES
(10, NULL), (20, NULL), (NULL, NULL), (20, 30), (NULL, NULL)

SELECT 
Value1, Value2

,ISNULL(Value1, 0) + ISNULL(Value2, 0) AS Value3
,COALESCE(Value1, 0) + COALESCE(Value2, 0) AS Value3
,CASE WHEN Value1 = NULL AND Value2 = NULL THEN NULL
    ELSE ISNULL(Value1, 0) + ISNULL(Value2, 0)
END AS Value3
FROM #AMOUNTS
| Value1 | Value2 | Value3 | Value3 | Value3 |
|--------|--------|--------|--------|--------|
| 10     | NULL   | 10     | 10     | 10     |
| 20     | NULL   | 20     | 20     | 20     |
| NULL   | NULL   | 0      | 0      | 0      |
| 20     | 30     | 50     | 50     | 50     |
| NULL   | NULL   | 0      | 0      | 0      |

【问题讨论】:

Value1 = NULL 永远不会是真的,NULL 不等于任何东西,包括NULL。你需要IS NULL 【参考方案1】:

在测试 NULL 时使用运算符 IS 而不是 =

CASE WHEN Value1 IS NULL AND Value2 IS NULL THEN NULL
ELSE ISNULL(Value1, 0) + ISNULL(Value2, 0)

【讨论】:

【参考方案2】:

使用case 表达式:

select (case when value1 is null and value2 is null
             then null
             else coalesce(value1, 0) + coalesce(value2, 0)
        end)

也就是说,apply 是一种获取平均值的简单方法:

select t.*, v.avg_value
from t cross apply
     (select avg(v.val) as avg_value
      from (values (value1), (value2)) v(val)
     ) v;
         

【讨论】:

【参考方案3】:

如果您不想在结果列中出现0s,您可以使用ISNULL()NULLIF()

SELECT *, NULLIF(ISNULL(Value1, 0) + ISNULL(Value2, 0), 0) Value3
FROM Amounts

请参阅demo。

【讨论】:

以上是关于SQL:包含 NULLS 的两列的总和?的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 对两个表中的两列求和并写入新列

在 Pandas 中处理 Nulls – 在一列中使用过滤值来填充另外两列中的 nan

SQL 将表作为参数传递?

需要 SQL 来选择行,直到列的总和达到最后一行不会完全消耗值的值

如何根据合并的数据框之一的两列的值在熊猫数据框中添加值

将数据从一列插入另一个表的两列的过程