2014-09-29 2 views
2

У меня есть три таблицы:3 таблицы SQL запрос

niveis(id, descricao) 
formacoes(id, id_nivel, nome) 
formacoes_professores(id, id_professor, id_formacao) 

Я хотел бы выполнить запрос, который возвращает уровень образования (niveis) с числом профессоров, который имеет его.

Я бегу этот запрос:

SELECT n.descricao, count(f.id_nivel) 
FROM niveis_de_formacao n 
LEFT OUTER JOIN formacoes f 
ON (n.id = f.id_nivel) 
GROUP BY n.descricao 

И я получаю этот результат:

descricao count 
Mestrado 0 
Graduação 2 
Doutorado 0 
Especialização 0 

Похоже, что я пытаюсь сделать. Но в этом вопросе я просто подсчитываю количество курсов, которые имеют уровень образования. Что я могу сделать, чтобы запросить таблицу formacoes_professores и подсчитать, сколько профессоров имеет уровень образования.

Например, если три профессора имеют один и тот же курс (позволяет предположить, что степень магистра), запрос должен возвращать:

Mestrado 3 

Но в запросе я бегу, вместо трех, Я получу Mestrado 1, потому что это тот же курс.

Спасибо.

+0

Попробуйте изменить свой вопрос и включить данные образца. Ваш запрос выглядит правильно. Если значение для «Mestrado» равно 0, данные не будут содержать ничего на этом уровне. –

+0

Хорошо, но я подсчитываю количество курсов на уровне образования. То, что мне нужно сделать, - подсчитать количество «профессоров» на уровне образования. Например, если три профессора имеют один и тот же курс, запрос должен возвращать три на этом уровне, но в запросе, который я запускаю, он вернется. 1 – ahmm95

ответ

0

Вам просто нужно добавить соединение? и сделать подсчеты отличными?

SELECT n.descricao, count(distinct f.id_nivel), count(distinct fp.id_professor) 
FROM niveis_de_formacao n 
LEFT OUTER JOIN formacoes f 
    ON (n.id = f.id_nivel) 
LEFT OUTER JOIN formacoes_professores fp 
    ON f.id = fp.id_formacao 
GROUP BY n.descricao 
+0

Спасибо, это сработало! Я еще не понял этого, но это сработало. Спасибо, спасибо. – ahmm95

+0

Присоединение привело к тому, что профессора, которых у вас не было в вашем первоначальном запросе, необходимы разные значения, иначе форматы будут дублированы на одного профессора, искусственно увеличивающего количество, поэтому потребность в них также будет различаться. – xQbert

0

Кажется, вы пытаетесь также получить счет профессора. Я рекомендую использовать производную таблицу, в которой есть кол-во профессоров, и присоединиться к ней.

SELECT t1.* , COALESCE(t2.cnt,0) professor_count 
FROM (
    SELECT n.id, n.descricao, count(f.id_nivel) education_count 
    FROM niveis_de_formacao n 
    LEFT OUTER JOIN formacoes f 
    ON (n.id = f.id_nivel) 
    GROUP BY n.id, n.descricao 
) t1 LEFT OUTER JOIN (
    SELECT count(*) cnt, f.id_nivel 
    FROM formacoes_professores fp 
    JOIN formacoes f ON f.id = fp.id_formacao 
    GROUP BY id_nivel 
) t2 on t2.id_nivel = t1.id 
Смежные вопросы