2014-10-23 3 views
0

Ниже приведенный ниже SQL-запрос дает мне желаемые результаты, но использование операторов CASE кажется неправильным. Есть ли другой способ создать псевдоним для отфильтрованного столбца? Есть ли более эффективный способ достижения тех же результатов?Как создать псевдоним для отфильтрованного столбца в SQL-запросе

Вот текущий запрос:

SELECT 
     year, 
     college_name, 
     count(id_999999999) as count_id_999999999, 
     count(id_999999999)/count(student_id) as percent_id_999999999, 
     count(id_other) as count_id_other, 
     count(id_other)/count(student_id) as percent_id_other, 
     count(student_id) as total_id 

FROM  (SELECT fiscal_year, semester, 

       CASE 
        WHEN student_id IN ('999999999') THEN 'id - 999999999' 
       END 
       AS id_999999999, 

       CASE 
        WHEN student_id NOT IN ('999999999') THEN 'id - Other' 
       END 
       AS id_other, 

       student_id 

      FROM enrolment_data) enrol 

GROUP BY year, college_name 
ORDER BY year, college_name; 

И вот желаемые результаты:

enter image description here

ответ

1

запрос является слишком сложным. Вам не нужен подзапрос. Я бы назвал запрос:

SELECT year, college_name, 
     sum(case when student_id IN ('999999999') then 1 else 0 end) as count_id_999999999, 
     avg(case when student_id IN ('999999999') then 1.0 else 0 end) as percent_id_999999999, 
     sum(case when student_id NOT IN ('999999999') then 1 else 0 end) as count_id_other, 
     avg(case when student_id NOT IN ('999999999') then 1.0 else 0 end) as percent_id_other 
     count(*) as total_id 
FROM enrolment_data ed 
GROUP BY year, college_name 
ORDER BY year, college_name; 
+0

Спасибо. Можете ли вы объяснить, почему здесь работает функция AVG? Это кажется контр-интуитивным, поскольку столбец не отображает среднее значение. – b00kgrrl

+0

@mariita. , , Это на самом деле среднее значение. Когда совпадения равны 1, а несоответствия - 0, тогда среднее значение составляет 1 с. –

+0

Но я хочу знать процент по отношению к общему количеству записей, в том числе с нулевыми значениями. Так что если есть 100 записей, из которых 10 имеют нулевое значение для student_id и 20 имеют значение 999999, то процент_999999 должен составлять 20%. Будет ли работать функция AVG? – b00kgrrl

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