2011-10-26 7 views
0

J'ai une tableMySQL regroupant un champ d'état

id, location, status 
1, london, 1 
2, london, 0 
3, boston, 1 
4, boston, 1 

Je voudrais ma requête pour générer quelque chose comme ceci: -

location, status_1, status_0 
london, 1, 1 
boston, 2, 0 

jusqu'à présent j'ai: -

select count(id) as freq, location from my_table 
group by location order by freq desc; 

Je suis complètement perdu quant à l'endroit où aller à partir d'ici.

Répondre

1

Ce genre de transformation est mieux fait quel que soit le client est l'émission de la requête, mais si vous devez le faire dans la base de données, puis

select location, 
    sum(status = 1) AS status_1, 
    sum(status = 0) AS status_0 
from my_table 
group by location 

il est un peu hackish, mais le status = 1 ' quand status est vraiment 1, on évaluera à un booléen vrai, que MySQL transformera poliment en un entier '1', qui sera alors résumé. Il en va de même lorsque l'état est 0 et l'état = 0 est évalué à vrai.

+0

Ceci est sténographie, en utilisant la coulée implicite Marc dit, pour 'SUM (CASE WHEN status = 1 ALORS 1 0 ELSE END)' – MatBailie

+0

parfait, merci –

1

Donc, vous voulez compter les enregistrements pour chaque statut par ville?

Dans la requête ci-dessous, je grouper par emplacement (comme vous l'avez fait), puis ajouter une somme pour chaque état. À l'intérieur de la somme est un cas, qui renvoie 1 si l'enregistrement correspond à l'état souhaité, ou 0 sinon. De cette façon, vous comptez effectivement le nombre d'enregistrements pour chaque état par emplacement.

select 
    a.location, 
    sum(case when a.status = 1 then 1 else 0 end) as status_1, 
    sum(case when a.status = 0 then 1 else 0 end) as status_0 
from 
    YourTable a 
group by 
    a.location 
1
select location, 
sum(case when status = 1 then 1 else 0 end) as status_1, 
sum(case when status = 0 then 1 else 0 end) as status_0, 
from my_table 
group by location;