2010-11-24 5 views
1

J'ai deux tables dont je ne vais pas interroger certaines données. Le problème est que la requête ne s'arrête jamais et ne donne jamais de résultat.Requête de pourcentage SQL

La tâche consiste à obtenir le pourcentage de tous les acteurs masculins.

filmparticipation(partid, personid, filmid, parttype) 

person(personid, lastname, firstname, gender) 

C'est mon essai, quelqu'un peut me donner un indice pour accomplir la tâche?

SELECT (COUNT(p.personid)/COUNT(a.person)) * 100 
FROM person p, person a, filmparticipation f 
WHERE 
f.parttype = 'cast' AND 
p.gender = 'M'; 
+2

Quel moteur db s'il vous plaît? – gbn

+0

postgresql ...... – user265767

Répondre

1

Que diriez-vous:

SELECT (COUNT(p.personid)/subq.total) * 100 
FROM person p, (select count(personID) as total from person) subq, filmparticipation f 
WHERE 
f.parttype = 'cast' 
and f.personid = p.personid  
and p.gender = 'M'; 

Je pense le problème que vous aviez avant a été sélectionné dans person deux fois et ne pas se joindre à la deuxième sélection (a) avec quoi que ce soit, qui peut conduire à un cartésienne rejoindre (qui reviendrait finalement, mais peut-être pas pour le moment).

+0

vous avez toujours besoin d'une jointure entre la personne et la participation au film –

+1

D'accord avec Conrad; la jointure manquante est sans doute la partie la plus importante du problème. :) –

+0

@Conrad: Correction. Je viens de copier la requête d'origine et de résoudre le problème le plus évident (pour moi, c'est). – FrustratedWithFormsDesigner

5

Vous n'aviez aucune clause ON pour vos jointures, donc vous joignez chaque enregistrement avec tous les autres enregistrements sur trois tables! Au lieu de cela, essayer quelque chose comme ceci:

select (count(case when p.gender = 'M' then 1 end)/count(*)) * 100 
from person p 
inner join filmparticipation f on p.personid = f.personid 
where f.parttype = 'cast' 
0

Eh bien, une partie du problème vous est n'êtes pas joindrez les tables - vous ne donnez pas la requête toute relation entre eux, et il est donc d'essayer de regrouper toutes les combinaisons possibles de tous les enregistrements dans tous les tableaux. Vous voulez quelque chose comme ceci:

SELECT COUNT(p.personid) AS ActorCount, 
     SUM(CASE WHEN p.gender = 'M' THEN 1 ELSE 0 END) AS MaleActorCount, 
     (SUM(CASE WHEN p.gender = 'M' THEN 1 ELSE 0 END)/COUNT(p.personid) * 100) AS PercentMaleActors 
FROM person p 
INNER JOIN filmparticipation f ON p.personid = f.personid 
WHERE f.parttype = 'cast' 
Questions connexes