2015-01-05 154 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