计算SQL中的多个CASE出现次数

时间:2016-12-15 10:55:25

标签: mysql sql

我正在寻找以下问题的解决方案:

SELECT CASE WHEN p.value LIKE '%foo%' THEN 'foos'
    WHEN p.value LIKE '%bar%' THEN 'bars'
    WHEN p.value LIKE '%bakar%' THEN 'bakars'
    ELSE p.value END as value,
COUNT(*) as count FROM table_a p GROUP BY value

值类似于:

foo, bar, foo and bar, bakar, bakarbar, foobar

此查询的结果是:

 value    count
 foos       3
 bars       2
 bakars     1

此代码成功计算出现次数,但CASE在第一次匹配时停止。 有没有办法做到这一点?

value    count
 foos       3
 bars       4
 bakars     2

4 个答案:

答案 0 :(得分:5)

如果您想在每个字符串中计算多于1次,则可以使用UNION

SELECT 'foos' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%foo%'
UNION ALL
SELECT 'bars' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%bar%'
UNION ALL
SELECT 'bakars' as value, count(*)
FROM YourTable
WHERE p.value LIKE '%bakar%'

答案 1 :(得分:4)

在单个case表达式中,由于case在第一场比赛中停止,因此无法准确达到所需要的效果。

您需要单独的case表达式或if()函数调用才能达到预期的结果。如果您不介意将结果放在不同的列中,请使用条件计数:

select count(if(p.value LIKE '%foo%',1,null)) as foos,
       ...
from table_a p

如果您坚持在同一列中收到计数,请使用union

select 'foos' as `value`, count(*) from table_a where table_a.value LIKE '%foo%'
union
...

答案 2 :(得分:3)

select      w.word 
           ,count(*)

from        table_a 

            join  (         select 'foo'  as word 
                  union all select 'bar' 
                  union all select 'bakar'
                  ) w

            on   value like concat('%',w.word,'%')

group by    w.word  
;          

答案 3 :(得分:1)

试试这个:

 SELECT 
    (select count(p1.value) from table_a p1 where p1.value LIKE '%foo%') as foos,
    (select count(p2.value) from table_a p2 where p2.value LIKE '%bar%') as bars,
    (select count(p3.value) from table_a p3 where p3.value LIKE '%bakar%') as bakars
     FROM table_a p GROUP BY p.value