Oracle SQL查询,是否可以对列中的值进行拆分和计数?

时间:2019-04-12 16:51:25

标签: sql oracle

我有一种情况,我想计算一个列中出现一个值的次数,但是现在的问题是该列有多个以定界符定界的

我尝试使用拆分功能,但未获得期望的结果 以下是数据的示例:

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

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

预期结果:

Count_Analytics  Count_Transpose  Count_Rest
3                2                2

2 个答案:

答案 0 :(得分: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,我们使用逗号作为分隔符分隔文本,然后您就可以得到计数了。

如果您仍然希望获得问题所示的结果,则可以使用数据透视功能。

答案 1 :(得分: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