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 选择用逗号分隔的值并分组的主要内容,如果未能解决你的问题,请参考以下文章