一次计算多个列中的非空值,无需在 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
如果应用于您问题中的示例数据 - 输出为
我有一个 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
如果应用于您问题中的示例数据 - 输出为