2009-09-23 6 views
0

Je travaille avec des données d'enquête. Essentiellement, je veux compter le nombre total de réponses pour une question pour un emplacement, puis utiliser ce total pour créer le pourcentage de toutes les réponses pour chaque réponse particulière. Je veux ensuite regrouper les résultats par lieu.Obtenir la valeur en pourcentage des résultats GROUP BY dans MySQL

Une sortie idéale serait similaire à ceci:

Q1 | Etat | Ville | %

oui | MA | bos | 10

non | MA | bos | 40

m. | MA | bos | 50

oui | MA | came | 20

non | MA | came | 20

m. | MA | cam | 80

Le problème que je tombe sur (je crois) est que GROUP BY œuvres avant ma déclaration count, donc je ne peux pas compter toutes les réponses. Voici un exemple de ce que je dois produire des nombres réels:

SELECT q1, state, city, COUNT(q1) FROM master GROUP BY state, city, q1 

Toutes les questions ont des réponses, donc ci-dessous est ma tentative pour obtenir le pourcentage:

SELECT q1, state, city, count(q1)/(count(nullif(q1,0))) as percent FROM master group by state, city, q1 

Je crois en utilisant WITH ou OVER(PARTITION BY...) seraient être une avenue possible, mais je ne peux pas non plus travailler.

Répondre

0
GROUP BY state, city, COUNT(q1) 
+0

Merci Jeff. Si je groupais par compte (q1), je ne pense pas que cela m'aidera à obtenir le total des réponses par question, pour ensuite utiliser contre le compte (q1). Au lieu de count (q1) je veux compter (q1)/total_responses_per_this_location, ou quelque chose comme ça. ou est-ce que je complique les choses? –

+0

Ce serait deux agrégats distincts sur un critère de sélection différent, ce à quoi Trevor a répondu. –

1

Je pense que la requête doit être formulée en deux parties. Un pour obtenir le compte par État + Ville plus un autre pour obtenir le compte par État + Ville + Q1. Vous joignez ensuite ces deux requêtes ensemble et faites le calcul sur les résultats combinés. Il pourrait y avoir une solution plus élégante que celle-ci, mais quelque chose dans ce sens pourrait peut-être fonctionner. Toutes mes excuses pour les fautes de frappe!

 
select t1.q1, t1.state, t1.city, ResponseCount, 100.0 * ResponseCount/CityCount as "%" 
from 
    (select q1, state, city, count(q1) as ResponseCount 
    from master 
    group by state, city, q1) t1 
join 
    (select state, city, count(*) as CityCount 
    from master 
    group by state, city) t2 
on t2.State = t1.State and t2.City = t1.City 

Espérons que cela aide.