sql 如何将多个 select 字段转换为带总计的行
sql how to convert multi select field to rows with totals
我有一个 table,它有一个字段,其中的内容是来自多 select 形式的 select 离子的串联列表。我想将此字段中的数据转换为另一个 table 中的数据,其中每一行都有 selection 的文本并计算此 selection 的创建次数。
例如
原文table:
id selections
1 A;B
2 B;D
3 A;B;D
4 C
我想得到以下内容:
selection count
A 2
B 3
C 1
D 2
我可以在 javascript 等中使用拆分和映射轻松地做到这一点,但不确定如何在 SQL 中处理它。 (我使用 Postgresql)目标是使用第二个 table 在 Google Data Studio 中绘制图表。
您可以使用横向连接和方便的 set-returning 函数 regexp_split_to_table()
将字符串取消嵌套到行,然后聚合和计数:
select x.selection, count(*) cnt
from mytable t
cross join lateral regexp_split_to_table(t.selections, ';') x(selection)
group by x.selection
更简单的解决方案:
select regexp_split_to_table(selections, ';'), count(*)
from test_table
group by 1
order by 1;
我有一个 table,它有一个字段,其中的内容是来自多 select 形式的 select 离子的串联列表。我想将此字段中的数据转换为另一个 table 中的数据,其中每一行都有 selection 的文本并计算此 selection 的创建次数。 例如
原文table:
id selections
1 A;B
2 B;D
3 A;B;D
4 C
我想得到以下内容:
selection count
A 2
B 3
C 1
D 2
我可以在 javascript 等中使用拆分和映射轻松地做到这一点,但不确定如何在 SQL 中处理它。 (我使用 Postgresql)目标是使用第二个 table 在 Google Data Studio 中绘制图表。
您可以使用横向连接和方便的 set-returning 函数 regexp_split_to_table()
将字符串取消嵌套到行,然后聚合和计数:
select x.selection, count(*) cnt
from mytable t
cross join lateral regexp_split_to_table(t.selections, ';') x(selection)
group by x.selection
更简单的解决方案:
select regexp_split_to_table(selections, ';'), count(*)
from test_table
group by 1
order by 1;