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

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

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

我尝试使用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
sql oracle
2个回答
1
投票

如果您想要计算除了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

1
投票

您可以使用以下代码

    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,我们将文本与逗号分隔为分隔符,然后您可以获取计数。

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

© www.soinside.com 2019 - 2024. All rights reserved.