我有一种情况,我想计算一个列中出现一个值的次数,但是现在的问题是该列有多个以定界符定界的
。我尝试使用拆分功能,但未获得期望的结果 以下是数据的示例:
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
答案 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