sql/oracle 选择用逗号分隔的值并分组

Posted

技术标签:

【中文标题】sql/oracle 选择用逗号分隔的值并分组【英文标题】:sql/oracle select values seperated by comma with grouping 【发布时间】:2021-12-10 16:27:00 【问题描述】:

我有这样的第一张桌子:table_1

date group_number c_id rate
01.01.2020 A 001 12.0
02.01.2020 A 001 12.0
01.01.2020 A 002 10.0
01.01.2020 B 103 8.0
01.01.2020 B 101 8.0
01.01.2020 C 203 11.0

还有第二个表_2,组名和记录日期:

date group_number
01.01.2020 A
02.02.2020 A
03.03.2020 A
01.01.2020 B
01.02.2020 B
01.01.2020 C

任务是将每个 c_id 的比率写入 table_2 中的新列,以逗号分隔,按 group_number 分组。我需要向 table_2 添加新列,如下所示:

date group_number rate_for_groups
01.01.2020 A 12.0, 10.0
02.02.2020 A 12.0, 10.0
03.03.2020 A 12.0, 10.0
01.01.2020 B 8.0, 8.0
01.02.2020 B 8.0, 8.0
01.01.2020 C 11.0

我尝试过这样做:

select *,    
  listagg(rate, ',') within group (order by C_ID) as rates
from table_1
group by group_number

但它引发了错误“不是按表达式分组”

【问题讨论】:

选择日期,group_number,..按日期分组,group_number 发布我的答案后,我发现我可能没有正确理解任务。为什么您为所有 B 行显示 8.0, 8.0,但为 A 行显示 12.0, 10.0 而不是 12.0, 12.0, 10.0?日期在这里起作用吗?如果有,具体是怎样的? 因为A行有两个相同的c_id,B行的c_id不同,所以8.0加了两次。 来自docs:原因:GROUP BY子句不包含SELECT子句中的所有表达式。未包含在组函数中的 SELECT 表达式(例如 AVG、COUNT、MAX、MIN、SUM、STDDEV 或 VARIANCE)必须列在 GROUP BY 子句中。描述的很清楚。 【参考方案1】:

您的查询只显示了一半的任务:您只查看table_1。使用GROUP BY group_number,您告诉 DBMS 只为每个group_number 选择一行。那张桌子很好。但是你不能SELECT *,因为每个group_number 有几行。 DBMS 应该如何知道为 group_number 显示哪一行的值?

从该查询中删除 * 以使其有效。请选择 group_number。然后将此结果加入table_2

select *
from table_2 t2
left outer join
(
  select
    group_number,
    listagg(rate, ',') within group (order by c_id) as rates
  from table_1
  group by group_number
) t1 on t1.group_number = t2.group_number
order by t2.group_number, t2.date;

【讨论】:

以上是关于sql/oracle 选择用逗号分隔的值并分组的主要内容,如果未能解决你的问题,请参考以下文章

读取逗号分隔值并批量插入SQL表

Excel:查找所有匹配值并放在逗号分隔列表中?

Sql Server实现多行数据按分组用逗号分隔成一行数据

如何访问包含逗号分隔值的输入框值并插入数据库

如何获取用逗号“,”分隔的值

获取用逗号分隔的值的计数[重复]