在PostgresSQL中,我试图获取每个字段和值对的值计数。 为了说明,我有2列,但实际上有100列。 因此,我需要一个编程解决方案。

一张桌子

| id | name  | gender |
-----------------------
| 1  | john  | male   |
| 2  | susan | female |
| 3  | john  | male   |
| 4  | john  | male   |
| 5  | susan | female |
| 6  | john  | male   |
| 7  | susan | female |
| 8  | julie | female |
| 9  | julie | female |

我知道

select name, count(*) as value_count
from table_name
group by name

给我我想要的一栏内容:

| name  | value_count |
-----------------------
| john  | 4           |
| susan | 3           |
| julie | 2           |

但是我如何以编程方式遍历所有列并生成它,例如:

| column_name | value_name | value_count |
------------------------------------------
| name        | john       | 4           |
| name        | susan      | 3           |
| name        | julie      | 2           |
| gender      | male       | 4           |
| gender      | female     | 5           |

#1楼 票数:2

使用grouping sets

select name, gender, count(*) as value_count
from my_table
group by grouping sets ((name), (gender))

 name  | gender | value_count 
-------+--------+-------------
 john  |        |           4
 julie |        |           2
 susan |        |           3
       | female |           5
       | male   |           4
(5 rows)

如果确定要获得上述格式的结果:

select 
    case when gender is null then 'name' else 'gender' end as column_name,
    coalesce(gender, name) as value_name,
    value_count
from (
    select name, gender, count(*) as value_count
    from my_table
    group by grouping sets ((name), (gender))
    ) s

 column_name | value_name | value_count 
-------------+------------+-------------
 name        | john       |           4
 name        | julie      |           2
 name        | susan      |           3
 gender      | female     |           5
 gender      | male       |           4
(5 rows)

#2楼 票数:0

你可以对这些做一个工会

select 'name' as column_name, name as value_name, count(distinct id) as value_count
from table_name
group by name
union
select 'gender' as column_name, gender as value_name, count(distinct id) as value_count
from table_name
group by gender

#3楼 票数:0

如果值兼容(即所有字符串),则只能执行所需的操作,所以让我假设是这种情况。

然后,您可以使用横向联接:

select col, val, count(*)
from t cross join lateral
     (values ('name', name::text),
             ('gender', gender::text),
             . . .
     ) v(col, val)
group by col, val
order by col, count(*) desc;

您需要填写values()语句。 实际上,您可以使用INFORMATION_SCHEMA.COLUMNS上的select语句生成代码。

  ask by scottlittle translate from so

未解决问题?本站智能推荐:

2回复

查询单个表中字段值的计数

我有一个包含多个字段的产品表,其中包含用户对各种属性的评估: 我需要编写一个查询,以汇总所有产品的属性评估(其中不为null): 这个SQL让我有办法: 但是,它不会按列中具有错误计数的行将attr_1, attr_2..按行分组(如上面所需的结果集所示)。 我正在使用
1回复

SQL计数比较一个字段值在另一个字段中的出现

我在这里查询有问题。 我在表中引用了两个字段bookno和quotedbookno。 我试图找到每本书引用另一本书的书名,并且至少有两本书被引用。 空部分很好,但我想知道count函数出了什么问题
1回复

获取表sql上每个字段的名称

我正在尝试做一个简单的查询,但无法获得所需的结果。 我有一个带有两个引用ID的表BATTLE。 我要排成一排,每个英雄的名字基于其他表HERO 战斗 ID hero1_id hero2_id 英雄 ID 名称 我在做这个查
2回复

表中每个记录的计数

我有一张表格(stu_grades),用于存储他们参加过的中心的学生数据及其成绩 我想找出例如该表中的每个学生在任何中心获得“ A”然后“ B”等的次数 stu_grades 同一学生可能在表中出现多次相同的成绩,甚至相同的成绩,甚至不同的中心 我特别想检查成绩在哪里出
1回复

为表的每个字段选择COUNT,其中字段NOT NULL

我有一个包含很多字段的表,我需要为每个字段返回COUNT NOT NOT NULL。 我在PHP中进行循环,并按字段执行1个请求... 我认为这不是更好的方法,我们肯定可以通过单个postgreSQL请求返回相同的最终结果? 感谢帮助
2回复

成对计数共享另一个字段的相同值到 SQL 中的邻接列表中

我有一张看起来像这样的桌子 我正在寻找一个查询,该查询将按所有对共享相同 id 的名称对聚合 id 的计数。 也就是说,我想要的查询将其转换为: 如果我数数正确,我认为是正确的。 值得注意的是: self-self 是该名称的总数,并且 也 AB = BA 并且不重复。
2回复

限制每个字段

假设我们有这样一个sql查询,其中包含来自另一个表的连接数据。 到目前为止,我们必须为几个resort_id做几个查询。 如何更改查询以便我们只有一个查询(WHERE resort_id in(612,333,111),每个resort_id的结果不超过30个项目?
2回复

对于每个类别(一个字段),我希望按计数排名前十的类型(另一个字段)

假设我有一个看起来像这样的表: 对于每个类别,我都希望按计数排名前十的类型。 给定有问题的表实际上是数百万行,如果我只是简单地进行select category, type, sum(Count) group by category, type order by category,