【问题标题】:Count of non-null columns in each row每行中非空列的计数
【发布时间】:2013-08-14 03:22:49
【问题描述】:

我有一个包含 4 列的表,在第 5 列中,我想存储前 4 列中有多少非空列的计数。例如:

其中 X 是任意值:

Column1 | Column2 | Column3 | Column4 | Count
  X     |    X    |   NULL  |    X    |   3
 NULL   |   NULL  |    X    |    X    |   2
 NULL   |   NULL  |   NULL  |   NULL  |   0

【问题讨论】:

  • 你为什么要那个?你什么时候想要那个?你想自动填写吗?
  • 这些是字符串列吗?

标签: sql sql-server tsql select


【解决方案1】:
SELECT   Column1,
         Column2,
         Column3,
         Column4,
         CASE WHEN Column1 IS NOT NULL THEN 1 ELSE 0 END + 
         CASE WHEN Column2 IS NOT NULL THEN 1 ELSE 0 END + 
         CASE WHEN Column3 IS NOT NULL THEN 1 ELSE 0 END + 
         CASE WHEN Column4 IS NOT NULL THEN 1 ELSE 0 END AS Column5
FROM     Table

【讨论】:

  • 太棒了。完美运行!
  • 非常简单易行的方法!
【解决方案2】:
SELECT Column1, Column2, Column3, Column4,
  Column5 = LEN(COALESCE(LEFT(Column1,1),'')) 
          + LEN(COALESCE(LEFT(Column2,1),''))
          + LEN(COALESCE(LEFT(Column3,1),'')) 
          + LEN(COALESCE(LEFT(Column4,1),''))
 FROM dbo.YourTable;

演示:

DECLARE @x TABLE(a VARCHAR(32),b INT,c VARCHAR(32),d VARCHAR(32));

INSERT @x VALUES
('01',3023,NULL,'blat'),
('02',NULL, NULL,'blat'),
('03',5,NULL,'blat'),
('04',24,'bo','blat'),
(NULL, NULL, NULL, NULL);

SELECT a, b, c, d,
    LEN(COALESCE(LEFT(a,1),'')) 
  + LEN(COALESCE(LEFT(b,1),''))
  + LEN(COALESCE(LEFT(c,1),'')) 
  + LEN(COALESCE(LEFT(d,1),''))
 FROM @x;

【讨论】:

  • 我喜欢这个答案的原因是它适用于不同类型的列,而我可以想象我的答案对于列中的某些类型/值组合会失败的情况
【解决方案3】:
select
    T.Column1,
    T.Column2,
    T.Column3,
    T.Column4,
    (
        select count(*)
        from (values (T.Column1), (T.Column2), (T.Column3), (T.Column4)) as v(col)
        where v.col is not null
    ) as Column5
from Table1 as T

【讨论】:

  • @GuilhermeCamposHazan 可以,但它可能不适用于不同类型的列
  • 嘿@RomanPekar,我以前从未见过这种语法,您可以从同一个表中提取列的值并用括号重命名表,然后调用表不为空的地方?你能帮忙详细说明那里发生了什么吗?
  • 嗯,它实际上是标准 SQL。如果您觉得 values 更易读,可以将 values 替换为 select ... union all。所以基本上,对于每一行,我们创建一个假的“表”,其中包含来自所选列的数据的行,然后在其上运行聚合查询
  • 是的@romanpekar。这在类型不同的情况下不起作用。我在表格中有一个日期和整数,但它似乎没有拉动。
【解决方案4】:

这将要求您在每次更新其余列时对 Count 列运行 UPDATE 查询,或者如果您的数据库允许,您可以设置触发器。

如果您要创建这样的视图,那么以下查询就可以了,

SELECT
  Column1,
  Column2,
  Column3,
  Column4,
  (
    COALESCE((CASE WHEN Column1 IS NOT NULL THEN 1 ELSE 0 END), 0)
    + COALESCE((CASE WHEN Column2 IS NOT NULL THEN 1 ELSE 0 END), 0)
    + COALESCE((CASE WHEN Column3 IS NOT NULL THEN 1 ELSE 0 END), 0)
    + COALESCE((CASE WHEN Column4 IS NOT NULL THEN 1 ELSE 0 END), 0)
  ) AS Count
FROM some_table;

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2021-06-18
    • 2018-06-27
    相关资源
    最近更新 更多