2014-12-10 3 views
1

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

PROGRAMME_NAME        | LABEL | VALUE 
    BSc (Hons) Computer Science     | Placed | 2 
    BSc (Hons) Computing and Games Development | Unplaced | 1 
    BSc (Hons) Web Applications Development  | Unplaced | 1 
    BSc (Hons) Marine Biology and Coastal Ecology | Placed | 1 
    BSc (Hons) Computer Science     | Unplaced | 2 

Однако, я хотел бы, чтобы выводить запрос следующим образом:

PROGRAMME_NAME        | PLACED | UNPLACED 
    BSc (Hons) Computer Science     | 2  | 2 
    BSc (Hons) Computing and Games Development | 1  | 0 
    BSc (Hons) Web Applications Development  | 0  | 1 
    BSc (Hons) Marine Biology and Coastal Ecology | 1  | 0 

Это мой запрос:

SELECT programme_name, 
    CASE 
    WHEN cv_approval_date  IS NOT NULL 
    AND application_status_id != 7 
    OR application_status_id IS NULL 
    THEN 'Unplaced' 
    ELSE 'Placed' 
    END  AS label, 
    COUNT(*) AS value 
FROM programme 
LEFT JOIN student USING (programme_id) 
LEFT JOIN application USING (student_id) 
GROUP BY programme_name, 
    CASE 
    WHEN cv_approval_date  IS NOT NULL 
    AND application_status_id != 7 
    OR application_status_id IS NULL 
    THEN 'Unplaced' 
    ELSE 'Placed' 
    END; 

Как я могу это сделать? Любая помощь будет принята с благодарностью!

ответ

1

Просто используйте условную агрегацию:

SELECT programme_name, 
     SUM(CASE WHEN (cv_approval_date IS NOT NULL AND application_status_id <> 7) OR 
        application_status_id IS NULL 
       THEN 1 ELSE 0 END) as Unplaced, 
     SUM(CASE WHEN (cv_approval_date IS NOT NULL AND application_status_id <> 7) OR 
        application_status_id IS NULL 
       THEN 0 ELSE 1 END) as Placed 
FROM programme LEFT JOIN 
    student USING (programme_id) LEFT JOIN 
    application USING (student_id) 
GROUP BY programme_name; 

Некоторые примечания:

  • я заменил != с <>. Последний является стандартом ANSI для оператора.
  • Я добавил круглые скобки для условий. Они не являются строго необходимыми, но они разъясняют логику.
  • Два оператора case являются точно такими же, за исключением значений для then и else. Это помогает предотвратить ошибки в логике и обеспечивает учет всех студентов.
  • LEFT JOIN s не требуется, если у вас нет программ, в которых нет студентов/приложений.
+0

Фантастические новости! Спасибо за вашу помощь. –

Смежные вопросы