【问题标题】:Addition with NULL values across multiple columns跨多个列添加 NULL 值
【发布时间】:2021-09-07 12:11:17
【问题描述】:
Col1    Col2    Col3    SumCol
  4       9     NULL      13
NULL      8       2       10
  8       3     NULL      11
NULL      5       5       10

我有一个包含 Col1、Col2 和 Col3 列的表,我正在尝试创建一个新列 SumCol。我知道添加 NULL 值很烦人,所以我很感激任何帮助

【问题讨论】:

  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。 “我知道 NULL 值的加法很烦人”——这到底是什么意思?
  • 另外我注意到您还没有接受任何问题的答案。你熟悉“接受”答案吗?
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql sql-server tsql null addition


【解决方案1】:

使用 XQuery 或COALESCE() 非常简单。

SQL #1

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Col1 INT, Col2 INT, Col3 INT);
INSERT INTO @tbl (Col1, Col2, Col3) VALUES
(  4 , 9, NULL),
(NULL, 8,   2 ),
(  8 , 3, NULL),
(NULL, 5,   5 );
-- DDL and sample data population, end

SELECT ID, Col1, Col2, Col3
    , x.value('sum(/root/*/text())', 'INT') AS Summary
FROM @tbl
    CROSS APPLY (SELECT Col1, Col2, Col3 FOR XML PATH(''), TYPE, ROOT('root')) AS t(x);

SQL #2

根据@DaleK 的建议,下面是最常见的解决方案。

SELECT * 
    , Summary = COALESCE(Col1,0) + COALESCE(Col2,0) + COALESCE(Col3,0) 
FROM @tbl;

SQL #3

针对 Col1、Col2、...、ColN 场景量身定制的通用方式。

SELECT ID, Col1, Col2, Col3
    , x.value('sum(/root/*[not(local-name()="ID")]/text())', 'INT') AS Summary
FROM @tbl AS p
    CROSS APPLY (SELECT * FROM @tbl AS c
        WHERE c.ID = p.ID
        FOR XML PATH(''), TYPE, ROOT('root')) AS t(x);

输出

+----+------+------+------+---------+
| ID | Col1 | Col2 | Col3 | Summary |
+----+------+------+------+---------+
|  1 | 4    |    9 | NULL |      13 |
|  2 | NULL |    8 | 2    |      10 |
|  3 | 8    |    3 | NULL |      11 |
|  4 | NULL |    5 | 5    |      10 |
+----+------+------+------+---------+

【讨论】:

  • 我一定是遗漏了什么,不就是SELECT ID, Col1, Col2, Col3, coalesce(Col1,0)+coalesce(Col2,0)+coalesce(Col3,0) SumCol FROM @tbl这么简单吗?
  • @DaleK,给猫剥皮的方法有很多。特别适用于 col1, col2, ..., colN 场景。
  • 嗯,是的,但是不会选择最简单、性能最好的方法吗?
  • 没错,但 OP 要求的列数不超过 3 个。
  • 这就是为什么你通常会避免回答这么糟糕的问题。但是,如果您倾向于添加这两种解决方案来覆盖您的基础。
【解决方案2】:

您可以在 sql-server 中使用以下查询

select id, col1, col2, col3, (coalesce(col1, 0) + coalesce(col2, 0) + coalesce(col3, 0)) total
from @tbl

select id, col1, col2, col3, (ISNULL(col1, 0) + ISNULL(col2, 0) + ISNULL(col3, 0)) total
from @tbl

【讨论】:

    【解决方案3】:

    计算列通常更容易,如果您希望该计算始终可供查询表的任何人使用:

    ALTER TABLE YourTable
      ADD COLUMN SumCol AS ISNULL(Col1, 0) + ISNULL(Col2, 0) + ISNULL(Col3, 0);
    

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2012-10-02
      • 2023-03-25
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多