我的表有多个列,我想获取每列中的值计数并在 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 中分别显示每列的计数值的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中的表的多个列中查找连接的字符串

显示表中的所有列以及每列中填充的记录数

如何根据条件从每列中获取唯一值?

如何列出各个列,其中每个列包含一个 id 计数,其中每列中的 id 不在 MySQL 中每列的不同表中

Oracle SQL 查询从一行中的多个列中获取最新数据

多列中的不同值