2016-12-15 69 views
8

我在寻找以下问题的解决方案:计数多案例出现在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 
+0

这可能有助于http://stackoverflow.com/questions/5045124/count-case-and-when-statement-in-mysql – 2016-12-15 10:58:10

+0

你由其他值组。请向我们展示p.value的所有值 –

+0

@BerndBuffen,同一列。合格与否... – jarlh

回答

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 
... 
+0

我很害怕这种情况。在我的情况下,工会的数据太多了,所以我不得不寻找其他解决方案。谢谢。 – Kadel

+0

看看本主题中接受答案的动态部分:http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-ofcolumns – Shadow

4

您可以使用UNION如果要算超过1次出现在每个字符串:没有

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%' 
+0

虽然不适合我的案例,但这也是一个有效的答案,谢谢! – Kadel

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 
+1

有趣的解决方案,把它放在行。我会研究一下。 – Kadel

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 
;   
+0

concat似乎对我有一些排序问题,我会进行调查。谢谢! – Kadel

+0

你可以请添加你的表DDL吗?谢谢 –