8 votes

Compter les occurrences multiples de CASE en SQL

Je cherche une solution au problème suivant :

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

Les valeurs sont de l'ordre de

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

Le résultat de cette requête est le suivant :

 value    count
 foos       3
 bars       2
 bakars     1

Ce code réussit à compter les occurrences, mais le CASE s'arrête à la première correspondance. Existe-t-il un moyen d'y parvenir ?

value    count
 foos       3
 bars       4
 bakars     2

4voto

sagi Points 32665

Vous pouvez utiliser UNION si vous souhaitez compter plus d'une occurrence dans chaque chaîne :

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

4voto

Shadow Points 24929

En une seule fois case expression non, vous ne pouvez pas obtenir ce que vous voulez précisément parce que case s'arrête au premier match.

Vous devez disposer de case ou if() pour obtenir le résultat escompté. Si vous ne voyez pas d'inconvénient à ce que les résultats figurent dans des colonnes différentes, utilisez le comptage conditionnel :

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

Si vous insistez pour recevoir les comptes dans la même colonne, utilisez alors union :

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

3voto

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  
;

1voto

nimour pristou Points 140

Essayez ceci :

 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X