2011-01-20 3 views
2

Хорошо, еще один вопрос SQL. То, что я пытаюсь достичь, - это показать компании, которая учит своих сотрудников, и оттуда, которая является самой популярной для каждой компании.
В настоящее время, это то, что у меня есть:Рейтинг SQL на 2 уровнях

ВЫБРАТЬ a.corporatename, e.course_title, b.studentID ОТ корпоративной
РЕГИСТРИРУЙТЕСЬ студентов б ON a.corporateID = b.corporateID
РЕГИСТРИРУЙТЕСЬ studentcoursedetails гр ПО b.studentID = c.studentID
РЕГИСТРИРУЙТЕСЬ classdetails d ON c.classdetailID = d.classdetailID
РЕГИСТРИРУЙТЕСЬ курс е ON d.courseID = e.courseID
WHERE b.corporateID! = '0'
ЗАКАЗ BY a.corporatename, e.course_title

Это дает мне что-то вдоль этих линий:

corporatename ----------------------------- course_title ---------------- ----------------- studentID
Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 5
Deutsche Lufthansa AG Berlin ----- Airline Security Operations ---- ----- 6
Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 5
Deutsche Lufthansa AG Berlin ----- Workshop on Crisis Management ------ 6
Deutsche Lufthansa AG Berlin----- 10 ------ 7
Korean Air Lines Co., Ltd ---------- Airline Security Operations --------- 8

Исходя из вышеизложенного, мы можем видеть, что Lufthansa направила своих сотрудников в 2 курса. Несмотря на то, что studentID 5 был к определенному курсу дважды, потому что он завалил первую попытку, он записывается как 2 записи.

То, что я надеюсь достичь это:

Deutsche Lufthansa AG Berlin ----- Airline Security Operations --------- 3
Deutsche Lufthansa AG Berlin ----- Workshop on Crisis Management ------ 2
Korean Air Lines Co., Ltd ---------- Airline Security Operations --------- 1

Я пытался использовать этот код:

SELECT a.corporatename, e.COURSE_TITLE, граф (DISTINCT b.studentID) А.С. общая
ОТ корпоративной
РЕГИСТРИРУЙТЕСЬ студентов б ПО a.corporateID = b.corporateID
РЕГИСТРИРУЙТЕСЬ studentcoursedetails гр ПО b.studentID = c.studentID
РЕГИСТРИРУЙТЕСЬ classdetails d ПО c.classdetailID = d.classdetailID
РЕГИСТРИРУЙТЕСЬ курс е ON d.courseID = e.courseID
ГДЕ b.corporateID! = '0'
GROUP BY a.corporatename
ORDER BY a.corporatename, е. COURSE_TITLE

Но что я получил:

corporatename ------------------- ---------- course_title --------------------------------- total
Deutsche Lufthansa AG Berlin - --- Workshop on Crisis Management ------ 3
Korean Air Lines Co., Ltd ---------- Airline Security Operations --------- 1

это показывает мне самый популярный, да, но я Мне бы хотелось сравнить все ранги.
Буду признателен за любую помощь по этому вопросу.

Благодаря bluish, простое решение.

ВЫБОР a.corporatename, e.course_title, граф (b.studentID) А.С. общей
ОТ корпоративного
РЕГИСТРИРУЙТЕСЬ студентов б ПО a.corporateID = Ь. corporateID
JOIN studentcoursedetails c ON b.studentID = c.studentID
РЕГИСТРИРУЙТЕСЬ classdetails d ON c.classdetailID = d.classdetailID
РЕГИСТРИРУЙТЕСЬ курс е ON d.courseID = e.courseID
ГДЕ b.corporateID! = '0'
GROUP BY a.corporatename, e.course_title
ORDER BY a.corporatename, e.course_title

Я удалил DISTINCT, потому что мне нужно собирать данные всех зачислений, а не каждого уникального пользователя. Благодарю.

+0

В любом случае, если вы используете 'COUNT (DISTINCT b.studentID)', Deutsche Lufthansa AG Берлин - Операции безопасности авиакомпании получат 2, а не 3, как вы сказал, что хочешь. Может быть, среди 'DISTINCT' и' 3' ошибочно. – bluish

ответ

1

Попробуйте также добавить e.course_title в GROUP BY:

SELECT a.corporatename, e.course_title, count(DISTINCT b.studentID) AS total 
FROM corporate a 
JOIN students b ON a.corporateID = b.corporateID 
JOIN studentcoursedetails c ON b.studentID = c.studentID 
JOIN classdetails d ON c.classdetailID = d.classdetailID 
JOIN course e ON d.courseID = e.courseID 
WHERE b.corporateID != '0' 
GROUP BY a.corporatename, e.course_title 
ORDER BY a.corporatename, e.course_title 
Смежные вопросы