一次计算多个列中的非空值,无需在 SQL 中手动输入

Count non-null values from multiple columns at once without manual entry in SQL

我有一个 SQL table 大约有 50 列,第一列代表唯一用户,其他列代表得分为 1-10 的类别。

这是我正在使用的东西的想法

user a b c
abc 5 null null
xyz null 6 null

我有兴趣计算每列非空值的数量。

目前,我的查询是:

SELECT col_name, COUNT(col_name) AS count
FROM table
WHERE col_name IS NOT NULL

有没有一种方法可以计算一个查询中每一列的非空值,而无需手动输入每一列名称?

所需的输出将是:

column count
a 1
b 1
c 0

我没有在 big-query 中这样做,而是在 SQL 服务器中这样做,但是大查询也有 unpivot 的概念。基本上,您正在尝试将列转置为行,然后对列进行简单聚合以查看每列中有多少条记录有数据。我的示例如下所示,无需太多或任何调整即可在大型查询中使用。

这是我创建的table:

CREATE TABLE example(
  user_name char(3),
  a integer,
  b integer,
  c integer
);

INSERT INTO example(user_name, a, b, c)
VALUES('abc', 5, null, null);

INSERT INTO example(user_name, a, b, c)
VALUES('xyz', null, 6, null);

INSERT INTO example(user_name, a, b, c)
VALUES('tst', 3, 6, 1);

这是我做的 UNPIVOT:

select count(*) as amount, col 
from 
    (select user_name, a, b, c from example) e
unpivot
 (blah for col in (a, b, c)
) as unpvt
group by col

这是输出示例(请注意,我在 table 中添加了一条额外记录以确保其正常工作):

同样,BigQuery 中的语法可能略有不同,但我认为应该可以帮助您完成大部分工作。

这是我的 db-fiddle - https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=deaa0e92a4ef1de7d4801e458652816b

的 link

考虑以下方法(完全不需要知道列名 - user 除外)

select column, countif(value != 'null') nulls_count
from your_table t,
unnest(array( 
  select as struct trim(arr[offset(0)], '"') column, trim(arr[offset(1)], '"') value
  from unnest(split(trim(to_json_string(t), '{}'))) kv,
  unnest([struct(split(kv, ':') as arr)])
  where trim(arr[offset(0)], '"') != 'user'
)) rec
group by column          

如果应用于您问题中的示例数据 - 输出为