Ранжирование SQL по 2 уровням - PullRequest
2 голосов
/ 20 января 2011

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

SELECT a.corporatename, e.course_title, b.studentID FROM корпоративный a
JOIN студенты b ON a.corporateID = b.corporateID
JOIN детали ученического курса c ON b.studentID = c.studentID
JOIN детали класса d ON c.classdetailID = d.classdetailID
JOIN курс e ON d.courseID = e.courseID
WHERE b.corporateID! = '0 '
ORDER 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 ----- Workshop on Crisis Management ------ 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, count (DISTINCT b.studentID) AS всего
ОТ корпоративный а
ПРИСОЕДИНЯЙТЕСЬ учеников б ВКЛ 1105 * ON b.studentID = c.studentID
JOIN classdetails d ON c.classdetailID = d.classdetailID
JOIN курсe ON d.courseID = e.courseID
ГДЕ b.corporateID! = '0'
GROUP BY a.corporatename
ЗАКАЗАТЬ a.corporatename, e.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, простое решение.

SELECT a.corporatename, e.course_title, count (b.studentID) AS всего
ОТ корпоративный a
JOIN студенты b ON a.corporateID = b.corporateID
JOIN studentcoursedetails c ON b.studentID = c.studentID
JOIN classdetails d ON c.classdetailID = d.classdetailID
JOIN курс e ON d.courseID = e.courseID
WHERE b.corporateID! = '0'
GROUP BY a.corporatename, e.course_title
ORDER BY a.corporatename, e.course_title

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

1 Ответ

1 голос
/ 20 января 2011

Попробуйте добавить также 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
...