2009-11-27 5 views
2

Veuillez consulter le tableau suivant (appelé réponse). Il montre quelle réponse un répondant a donné à une question et une réponse.Combinez deux petites requêtes (ce groupe de valeurs différentes) en une seule requête

questionid answerid respondentid 
     1   10  1 
     1   11  2 
     1   11  4 
     1   12  3 
     1   12  5 
     2   20  1 
     2   20  2 
     2   21  2 
     2   22  1 
     2   22  4 
     2   23  1 
     2   23  3 
     2   24  4 
     3   30  2 
     3   30  3 
     3   30  4 
     3   31  1 

Nous pouvons exécuter l'instruction SQL suivante:

select questionid, answerid, count(respondentid) as noOfRespondentsToQuestionAndAnswer 
from response 
group by questionid, answerid 

... qui nous dira combien de personnes interrogées ont répondu chaque combinaison question + réponse.

Nous pouvons également faire:

select questionid, count(distinct respondentid) as noOfRespondentsToQuestion 
from response 
group by questionid 

... qui nous dira combien de répondants distincts ont répondu à chaque question.

Je voudrais combiner les deux sélections à ONE et laisser le nombre de répondants distincts être représenté sur plus d'une ligne pour chaque questionid (ce qui serait nécessaire, car il est seulement basé sur question et non sur réponse).

Alors, je voudrais un résultat comme ce qui suit:

questionid,answerid,noOfRespondentsToQuestionAndAnswer,noOfRespondentsToQuestion 
1 10 1 5 
1 11 2 5 
1 12 2 5 
2 20 2 4 
2 21 1 4 
2 22 2 4 
2 23 2 4 
2 24 1 4 
3 30 3 4 
3 31 1 4 

Est-il possible de acheive cela avec une seule requête?

Répondre

0

Vous n'avez pas spécifié quel type de base de données, ce qui simplifierait cela, mais d'une idée purement SQL, n'utilisant aucune analyse, cela peut être fait, mais vous perdrez de l'efficacité.

select questionid, answerid, 
(select a.count(*) FROM datatable a WHERE a.questionid=questionid AND a.answerid=answerid), 
(select b.count(*) FROM datatable b WHERE b.questionid=questionid) 
FROM datatable ORDER BY questionid, answerid; 
3
select one.questionid, answerid, 
     noOfRespondentsToQuestionAndAnswer, 
     noOfRespondentsToQuestion 
FROM (
select questionid, answerid, 
     count(respondentid) as noOfRespondentsToQuestionAndAnswer 
from response 
group by questionid, answerid) AS one 
JOIN (
select questionid, count(distinct respondentid) as noOfRespondentsToQuestion 
from response 
group by questionid) AS two 
WHERE one.questionid = two.questionid; 
Questions connexes