2014-02-21 59 views
0

我做了unpivot,將列轉換爲行。 http://sqlfiddle.com/#!4/fc489/6SQL:oracle 11g,將結果集拆分爲2個子集並並排顯示

現在我想通過側像

AVGGPA  1     1 
COURSEAVG 101.5    101.5 
STUDENTNAME Jilly Doe   John Doe 

任何提示顯示給學生的信息?方

+0

爲什麼兩個子集 - 如果你有兩個以上的學生呢? –

+0

每個學生都會有不同的欄目,所以3個學生的含義是3列學生數據,每欄只有一個學生數據,最多隻能有5個學生 –

+0

樞軸在這裏工作,但爲什麼還難以使用SQL來處理它沒有設計的東西?用SQL檢索數據,讓你的應用程序格式和可視化。除非你真的想要明文SQLPlus結果... –

回答

1

如果你真的只有兩個子集擔心,一個簡單的方法來建立你有什麼至今:

SELECT labeln, 
    MAX(CASE WHEN rn = 1 THEN value1 END) AS col1, 
    MAX(CASE WHEN rn = 2 THEN value1 END) AS col2 
FROM (
    SELECT * FROM (
    SELECT to_char(avg(g1.grade)) AS avgGPa, 
     to_char(avg(s1.course)) AS courseAVG, 
     s1.student_name AS studentName, 
     ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY s1.student_name) AS RN 
    FROM student s1 
    JOIN grade g1 ON s1.student_name = g1.student_name 
    GROUP BY s1.student_name 
) 
    UNPIVOT (value1 FOR labeln IN (avggpa, courseavg, studentname)) 
) 
GROUP BY labeln 
ORDER BY labeln; 

SQL Fiddle

這基本上是一個手動轉動;將row_number()添加到您的原始查詢,然後使用它來決定相應的值進入哪個列,用max()摺疊空白。您可以通過複製max(case(...))位和更改rn檢查來輕鬆添加更多列。但是你必須知道你需要多少列才能結束;或高估並在最後有一些空白。

從理論上講,您可以使用實際的pivot(),但您事先不知道這些值,因此您沒有在for子句中使用的值。你也許可以使用XML方法,但這可能是矯枉過正的;取決於你的實際使用情況。

+0

真棒作品迷人的方式...我如何接受你的答案 –

相關問題