我的表有多个列,我想获取每列中的值计数并在 postgresql 中分别显示每列的计数值
Posted
技术标签:
【中文标题】我的表有多个列,我想获取每列中的值计数并在 postgresql 中分别显示每列的计数值【英文标题】:My table has multiple columns & I want to fetch count of values in each column & display the count values for each column separately in postgresql 【发布时间】:2021-11-25 10:04:28 【问题描述】:我想从表的每一列中获取每个非空项的计数值。该表包含 86 列,我希望表格格式的输出具有:
列名 |数
感谢您在这方面的任何帮助。谢谢
【问题讨论】:
【参考方案1】:这是我的建议的说明。 查询的第一部分(t CTE 定义)是特定于表的,因为它需要列出所有列名。我希望在适当的 SQL 客户端的帮助下,这将是微不足道的。其余的都是通用的。
create temporary table the_table (x integer, y integer, z integer);
insert into the_table
values
(null, 1, 1), (null, 2, 2), (3, 3, 3), (4, null, 4),
(5, 5, 5), (6, null, 6), (7, 7, null), (null, 8, 8);
with t(x, y, z) as
(
select count(x), count(y), count(z) from the_table
),
u as
(
select l.*
from t
cross join lateral jsonb_each_text(to_jsonb(t)) l
)
select
key as column_name, value::integer as count_of_values
from u;
column_name | count_of_values |
---|---|
x | 5 |
y | 6 |
z | 7 |
【讨论】:
【参考方案2】:您当然可以这样做:
select 'col1' as column_name, count(col1) from mytable
union all
select 'col2' as column_name, count(col2) from mytable
union all
...
select 'col86' as column_name, count(col86) from mytable;
(这很容易编写。例如,您可以将表格列表放入 Excel 中,应用连接公式,从而立即获得整个查询。)
【讨论】:
(number_of_columns) 次扫描? @Stefanov.sm:可能。除非优化器足够聪明,可以看穿这一点。然而,这是一个非常不寻常的查询,无论如何它可能是一次性的。那么为什么要打扰;-) 我和你在一起:)【参考方案3】:您可以使用to_jsonb()
将所有列动态转换为行,然后按列名分组和计数:
select j.column_name, count(j.value)
from the_table t
cross join lateral jsonb_each_text(jsonb_strip_nulls(to_jsonb(t))) as j(column_name, value)
group by j.column_name
order by j.column_name;
Online example
【讨论】:
以上是关于我的表有多个列,我想获取每列中的值计数并在 postgresql 中分别显示每列的计数值的主要内容,如果未能解决你的问题,请参考以下文章