计算单词在单个列中出现的次数

时间:2020-08-06 14:47:45

标签: sql oracle

我试图计算苹果和橙子出现在我的水果栏中的次数。 该表如下所示:

Fruit
-------
Apples
Apples Oranges
Apples Oranges
Apples
Oranges

预期输出:

Apples 4 
Oranges 3

到目前为止,我的代码。我不确定当两者都出现时该怎么做以及如何将它们添加到总计中。我敢肯定有一种更简单的方法。

SELECT 
     COUNT (CASE WHEN Fruit LIKE '%Apples%' THEN '1' END) AS Apples
     COUNT (CASE WHEN Fruit LIKE '%Oranges%' THEN '1' END) AS Oranges
FROM Fruits

欢呼

2 个答案:

答案 0 :(得分:1)

总和或计数都有效

已连接到: Oracle Database 12c企业版12.2.0.1.0版-64位生产

SQL> with t as
(
select 'Apples'            as fruits from dual union all
select 'Apples Oranges'    as fruits from dual union all
select 'Apples Oranges'    as fruits from dual union all
select 'Apples'            as fruits from dual union all
select 'Oranges'           as fruits  6   from dual
) select
     SUM (CASE WHEN fruits LIKE '%Apples%' THEN '1' END) AS Apples ,
     SUM (CASE WHEN fruits LIKE '%Oranges%' THEN '1' END) AS Oranges
FROM t 
  ;

 APPLES    ORANGES
---------- ----------
         4          3

SQL> with t as
    (
 select 'Apples'            as fruits from dual union all
select 'Apples Oranges'    as fruits from dual union all
 select 'Apples Oranges'    as fruits from dual union all
select 'Apples'            as fruits from dual union all
select 'Oranges'           as fruits from dual
) select
     COUNT (CASE WHEN fruits LIKE '%Apples%' THEN '1' END) AS Apples ,
     COUNT (CASE WHEN fruits LIKE '%Oranges%' THEN '1' END) AS Oranges
FROM t   ;

    APPLES    ORANGES
---------- ----------
         4          3

SQL>

答案 1 :(得分:1)

如果这些水果是单字的,并用空格隔开,那么这种 generic 方法可能对您来说很有趣。

第1-8行代表样本数据;您已经有该名称,因此无需输入。您可能需要的代码从第10行开始。

SQL> with fruit (fruit) as
  2  -- sample data; you have that in a table
  3    (select 'Apples'         from dual union all
  4     select 'Apples Oranges' from dual union all
  5     select 'Apples Oranges' from dual union all
  6     select 'Apples Lemon'   from dual union all
  7     select 'Oranges Plums'  from dual
  8    ),
  9  -- split fruits to rows
 10  temp as
 11    (select regexp_substr(fruit, '[^ ]+', 1, column_value) fruit
 12     from fruit cross join
 13       table(cast(multiset(select level from dual
 14                           connect by level <= regexp_count(fruit, ' ') + 1
 15                          ) as sys.odcinumberlist))
 16    )
 17  select fruit, count(*)
 18  from temp
 19  group by fruit
 20  order by fruit;

FRUIT                                                      COUNT(*)
-------------------------------------------------------- ----------
Apples                                                            4
Lemon                                                             1
Oranges                                                           3
Plums                                                             1

SQL>