((Oracle)拆分字符串,然后一次求平均值

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

我的列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 
oracle average
2个回答
0
投票

您在这里:

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计算平均值
© www.soinside.com 2019 - 2024. All rights reserved.