我的列COL1有时具有诸如'10 | 20'之类的数据。我的目标是在数据中包含“ |”的情况下拆分数据。然后将它们平均取15。如何在下面修改我的代码以像这样添加COL2?
(Expected results)
COL1 COL2
------- -------
10 10
10|20 15
10|20|30 20
(My code)
WITH A AS (
SELECT '10' COL1 FROM DUAL
UNION ALL
SELECT '10|20' FROM DUAL
UNION ALL
SELECT '10|20|30' FROM DUAL
) SELECT COL1 FROM A DUAL
您在这里:
SQL> with a as
2 (select '10' col1 from dual union all
3 select '10|20' from dual union all
4 select '10|20|30' from dual
5 )
6 select
7 col1,
8 avg(to_number(regexp_substr(col1, '[^\|]+', 1, column_value))) col2
9 from a cross join
10 table(cast(multiset(select level from dual
11 connect by level <= regexp_count(col1, '\|') + 1
12 ) as sys.odcinumberlist))
13 group by col1
14 order by col1;
COL1 COL2
-------- ----------
10 10
10|20 15
10|20|30 20
SQL>
它做什么?
第8行(在第10-12行的帮助下:]
REGEXP_SUBSTR
部分用于将列拆分为行TO_NUMBER
将子字符串转换为数字AVG
计算平均值