Oracle SQL Query,用于拆分和计算列中的值的功能?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle SQL Query,用于拆分和计算列中的值的功能?相关的知识,希望对你有一定的参考价值。

我有一个场景,我想计算一个值出现在列中的次数,但现在的问题是列有多个分隔符分隔。

我尝试使用Split Function但没有获得所需的结果下面是数据的示例:

ID   Column_Value
011  Analytics,Transpose  
012  Analytics  
013  Analytics,Transpose,Vector  
014  Vector,Dimension

现在,我的要求是计算Analytics在Column_Value中出现的次数,计算Transpose出现的次数,最后计算其他值的其余值(即Vector和Dimnesion)出现的次数。

预期结果:

Count_Analytics  Count_Transpose  Count_Rest
3                2                2
答案

如果您想要计算除了Analytics或Transpose之外的任何值的行数,您可以执行以下操作:

select
  count(case when regexp_like(column_value, '(^|,)Analytics(,|$)') then column_value end)
    as count_analytics,
  count(case when regexp_like(column_value, '(^|,)Transpose(,|$)') then column_value end)
    as count_transpose,
  count(regexp_replace(regexp_replace(column_value, '(^|,)Analytics(,|$)'), '(^|,)Transpose(,|$)'))
    as count_rest
from your_table;

COUNT_ANALYTICS COUNT_TRANSPOSE COUNT_REST
--------------- --------------- ----------
              3               2          2

如果要计算其他值的出现次数而不是行数,可以执行以下操作:

select
  count(case when regexp_like(column_value, '(^|,)Analytics(,|$)') then column_value end)
    as count_analytics,
  count(case when regexp_like(column_value, '(^|,)Transpose(,|$)') then column_value end)
    as count_transpose,
  sum(regexp_count(
    regexp_replace(regexp_replace(column_value, '(^|,)Analytics(,|$)'), '(^|,)Transpose(,|$)'),
     '[^,]+')) as count_rest
from your_table;

COUNT_ANALYTICS COUNT_TRANSPOSE COUNT_REST
--------------- --------------- ----------
              3               2          3
另一答案

您可以使用以下代码

    SELECT  DECODE(TEXT_RESULT, 'ANALYTICS', 'ANALYTICS', 'TRANSPOSE', 'TRANSPOSE', 'OTHERS') RES, COUNT(1)
  FROM (WITH TEMP AS (SELECT 1 ID, 'ANALYTICS,TRANSPOSE' TEXT FROM DUAL
                      UNION
                      SELECT 2 ID, 'ANALYTICS' TEXT FROM DUAL
                      UNION
                      SELECT 3 ID, 'ANALYTICS,TRANSPOSE,VECTOR' TEXT FROM DUAL
                      UNION
                      SELECT 4 ID, 'VECTOR,DIMENSION' TEXT FROM DUAL)
         SELECT DISTINCT ID,
                         REGEXP_SUBSTR(TEXT, '[^,]+', 1, LEVEL) TEXT_RESULT
           FROM TEMP
         CONNECT BY LEVEL <= REGEXP_COUNT(TEXT, '[^,]+'))
          GROUP BY DECODE(TEXT_RESULT, 'ANALYTICS', 'ANALYTICS', 'TRANSPOSE', 'TRANSPOSE', 'OTHERS');

结果如下。

    RES         COUNT(1)
1   ANALYTICS   3
2   OTHERS      3
3   TRANSPOSE   2

使用regexp_substr,我们将文本与逗号分隔为分隔符,然后您可以获取计数。

如果你仍然想要问题中显示的结果,你可以使用枢轴功能..

以上是关于Oracle SQL Query,用于拆分和计算列中的值的功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Oracle SQL 中的某些条件将列拆分为 2?

oracle列转行函数

关于Oracle中实现单列拆分成多列的技术应用

SQL (Oracle):按特定列分组

Table.SplitColumn拆分…Split…(Power Query 之 M 语言)

Oracle 11 SQL:有没有办法将 1 行拆分为 x 行