2015-01-05 5 views
0

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

month  | math | english 
------------+-------+------------ 
12/1/2014 | 42 | 137 
1/1/2015 | 137 | 76  
2/1/2015 | 139 | 79  
3/1/2015 | 143 | 83  

«Математика» и «Английский» - course_kind s, course_kind - столбец таблицы course_capacities. Можно ли создавать столбцы на основе различных значений в столбце?

Мой текущий SQL производит этот результат, который меньше, чем оптимален:

course_kind | month | capacity 
-------------+------------+---------- 
math   | 2015-01-01 |  47 
math   | 2015-02-01 |  43 
math   | 2015-03-01 |  43 
math   | 2015-04-01 |  45 
math   | 2015-05-01 |  46 
math   | 2015-06-01 |  46 
math   | 2015-07-01 |  46 
math   | 2015-08-01 |  46 
math   | 2015-09-01 |  47 
math   | 2015-10-01 |  47 
math   | 2015-11-01 |  47 
math   | 2015-12-01 |  47 
english  | 2015-01-01 |  97 
english  | 2015-01-01 |  73 
english  | 2015-02-01 |  76 
english  | 2015-03-01 |  79 
english  | 2015-04-01 |  83 
english  | 2015-05-01 |  83 
english  | 2015-06-01 |  87 
english  | 2015-07-01 |  89 
english  | 2015-08-01 |  91 
english  | 2015-09-01 |  93 
english  | 2015-10-01 |  97 
english  | 2015-11-01 |  97 
english  | 2015-12-01 |  97 

Вот SQL:

SELECT 
    course_capacities.course_kind, 
    monthly_course_capacities.month, 
    monthly_course_capacities.capacity 
FROM course_capacities 
    INNER JOIN monthly_course_capacities ON course_capacities.id = monthly_course_capacities.course_capacity_id 
    ORDER BY course_capacities.course_kind ASC, 
    monthly_course_capacities.month ASC; 

ответ

3

вы можете использовать case based aggregation, в значениях столбца случае course_kind известны и ограничены , другим, необходимо создать динамический запрос.

SELECT 
    monthly_course_capacities.month, 
    max(case when course_capacities.course_kind ='math' then capacity end) as math, 
    max(case when course_capacities.course_kind ='english' then capacity end) as english, 
FROM course_capacities 
INNER JOIN monthly_course_capacities ON course_capacities.id = monthly_course_capacities.course_capacity_id 
GROUP BY monthly_course_capacities.month 
Смежные вопросы