SQL查询动态获取字段值分布

问题描述 投票:0回答:2

有没有办法动态地获取SQL中字段的值分布?

我有一张250个字段的桌子。我想得到每个字段的值分布:

field0

value0: 10
value1: 100
value2: 30
...
valueN: X

field1

value0: 2
value1: 124
value2: 8
...
valueN: Y


....

我知道使用case + sum可以生成这个,但是可能的值必须提前放入查询中:

SELECT 
    , Sum( Case When field0 = value0 Then 1 Else 0 End ) As [0]
    , Sum( Case When field0 = value1 Then 1 Else 0 End ) As [1]
    , Sum( Case When field0 = value2 Then 1 Else 0 End ) As [2]
    , Sum( Case When field0 = value3 Then 1 Else 0 End ) As [3]
    , Sum( Case When field0 = valueN Then 1 Else 0 End ) As [4]
FROM table

有没有办法动态地做到这一点?

sql
2个回答
1
投票

使用聚合函数(例如:count)有一种行结果(不是列结果)的方法

SELECT field0, 
       COUNT(*) 
FROM   table 
GROUP  BY field0 

如果你想在你的代码中得到一个列结果。对于某些DB品牌,有PIVOT功能。


1
投票

使用Postgres你可以这样做:

select t.name as column_name, 
       sum(val::int) as sum
from data d, jsonb_each_text(to_jsonb(d) - 'id') as t(name, val)
group by t.name;

- 'id'从生成的JSON中删除id属性。仅在聚合中包含某些列的另一个选项是添加where条件:

select column_name,
       sum(val::int) as sum
from (       
  select t.name as column_name, 
         t.val
  from data d, jsonb_each_text(to_jsonb(d)) as t(name, val)
) t
where column_name like 'col%'
group by column_name;

使用以下示例表:

create table data 
(
  id serial primary key,
  col1 int,
  col2 int,
  col3 int,
  col4 int,
  col5 int
);

insert into data (col1, col2, col3, col4, col5)
values 
(1, 2, 3, 4, 5),
(6, 7, 8, 9, 10),
(11, 12, 13, 14, 15);

该查询将返回:

column_name | sum
------------+----
col1        |  18
col2        |  21
col5        |  30
col4        |  27
col3        |  24
© www.soinside.com 2019 - 2024. All rights reserved.