2012-10-01 97 views
4

我真的不知道如何把這個,但請檢查下面的細節。作爲列的SQL查詢字段

學生

|Student_ID|Student_Name| 
|1   |Ryan  | 
|2   |Camille  | 
|3   |George  | 

|Student_ID|Subject |Grade 
|1   |Math |5 
|1   |English |3 
|1   |History |1 
|2   |Math |3 
|2   |English |4 
|2   |History |1 
|3   |Math |5 
|3   |English |1 
|3   |History |2 

是否有可能得到這樣的結果?

Student_Name|Math|English|History 
Ryan  |5 |3  |1 
Camille  |3 |4  |1 
George  |5 |1  |2 

現在我已經通過與第一列名填充未綁定的DataGrid這樣的在Hardway,那麼學生的名字,然後添加細節爲每個學生的名字。這很耗時,我想更好地優化查詢。

在此先感謝。

回答

3

雖然@如果你有一個已知的一些科目約翰的回答會的工作,如果你有數目不詳的主題,那麼你可以使用準備好的語句生成此動態。這裏是一個很好的文章:

Dynamic pivot tables (transform rows to columns)

您的代碼應該是這樣的:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(case when Subject = ''', 
     Subject, 
     ''' then Grade end) AS ', 
     Subject 
    ) 
) INTO @sql 
FROM grade; 

SET @sql = CONCAT('SELECT s.Student_name, ', @sql, ' 
        FROM student s 
        LEFT JOIN grade AS g 
        ON s.student_id = g.student_id 
        GROUP BY s.Student_name'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle With Demo

+0

我真的很喜歡這個!感謝您指出:) –

+0

我已經設法與@ John的答案合作,通過.net獲取列名計數,然後用另一個數據集填充它。然後我繼續用行填充另一個數據集。但你的答案很棒。哇,只是哇。謝謝。 –

+0

@bluefeet,我設法使用你的答案並將其轉換爲存儲過程。非常感謝你。 –

11

嘗試,

SELECT a.Student_name, 
     MAX(CASE WHEN subject = 'MATH' THEN grade ELSE NULL END) MathGrade, 
     MAX(CASE WHEN subject = 'ENGLISH' THEN grade ELSE NULL END) EnglishGrade, 
     MAX(CASE WHEN subject = 'History' THEN grade ELSE NULL END) HistoryGrade 
FROM Student a 
     LEFT JOIN Grade b 
      ON a.Student_ID = b.Student_ID 
GROUP BY a.Student_name 

SQLFiddle Demo

+1

謝謝,我會納入這我在做什麼,並會回來給你的結果。 –

+0

我注意到您在查詢中預定義了主題名稱,系統可以添加比上面給出的主題更多的主題。有沒有辦法沒有預定義的查詢?對不起我的英語不好。 –

+0

好的,這解決了我的問題,我只需要玩一下。謝謝。 –