SQL процентный запрос - PullRequest
       3

SQL процентный запрос

1 голос
/ 24 ноября 2010

У меня есть две таблицы, из которых я хочу запросить некоторые данные.Проблема в том, что запрос никогда не останавливается и никогда не дает никакого результата.

Задача состоит в том, чтобы получить процент от всех актеров мужского пола.

filmparticipation(partid, personid, filmid, parttype)

person(personid, lastname, firstname, gender)

Это моя попытка, может кто-нибудь дать, пожалуйстамне подсказка, чтобы выполнить задачу?

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

Ответы [ 3 ]

5 голосов
/ 24 ноября 2010

У вас не было предложений ON для ваших объединений, поэтому вы объединяли каждую запись с каждой другой записью в трех таблицах! Вместо этого попробуйте что-то вроде этого:

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' 
1 голос
/ 24 ноября 2010

Как насчет:

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

Я думаю, проблема, с которой вы сталкивались раньше, заключалась в том, что вы дважды выбирали из person и не соединяли второй выбор (a) с чем-либо, что, возможно, приводило к декартовому объединению (которое в конечном итоге вернулось бы) , но, может быть, не на время).

0 голосов
/ 24 ноября 2010

Что ж, отчасти проблема в том, что вы не присоединяетесь к таблицам - вы не задаете запросу никаких отношений между ними, и поэтому он пытается объединить все возможные комбинации всех записей во всех таблицах.Вы хотите что-то вроде этого:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...