2013-07-13 37 views
1

假設我有一個名爲PROFILE和它的一個列的表是象下面這樣:如何在oracle sql中從一個列結構創建多列的視圖?

|NAMES| 
------- 
JAMES 
------- 
ANDY 
------- 
PETER 
------- 
SARAH 
------- 
JESSICA 
------- 
RACHEL 

我如何才能讓一個視圖,以便它顯示是這樣的:

|col1 | col2| col3 | 
-------|-----|--------| 
|JAMES |PETER|JESSICA| 
-------|-----|------- | 
|ANDY |SARAH|RACHEL | 
----------------------  

我需要這個的原因是因爲我需要使用它與頂點報告頁面,我打算做一個網格樣式佈局。Kinda很難解釋,但多數民衆贊成結構我想 喜歡實現。可能嗎?並會查詢太多行?

+0

什麼涉及其中記錄去哪些列?它是否可以超過3列(即你在尋找一個動態的列數)? – user2480596

+0

您能否詳細說明名稱的排序?爲什麼選擇JAMES | PETER | JESSICA?或者你只是想分成三個名字的小組? –

+0

你的'PROFILE'表總是有六行,還是你想動態創建列?它看起來像是希望來自'PROFILE'的「奇數」編號行分佈在結果的第一行以及第二行的「偶數」編號行。那是對的嗎? – BellevueBob

回答

3

假設你總是需要3列,那麼這將工作中使用MAXCASE進行樞軸,以ROW_NUMBER()MOD()沿:

SELECT MAX(CASE WHEN rn = 1 THEN name END) col1, 
    MAX(CASE WHEN rn = 2 THEN name END) col2, 
    MAX(CASE WHEN rn = 3 THEN name END) col3 
FROM (
    SELECT Row_Number() Over (Partition By MOD(ROWNUM,2) Order By Null) rn, MOD(ROWNUM,2) whichGroup, name 
    FROM profile 
) talias 
GROUP BY whichGroup 

使用MOD得到哪些行,並使用Row_Number你的支點。

SQL小提琴:http://sqlfiddle.com/#!4/46149/1

- 請注意,無需添加一個字段到您ORDER BY條款,您將無法保證特定的順序結果。

+0

謝謝@ user2480596。在你的筆記中,我真的不瞭解訂單的順序。如果我需要訂購,我應該在哪裏以及如何放置它?我試圖把它放在FROM配置文件,但沒有工作。需要按照相同的順序排列名稱,這可能嗎? – Psychocryo

1

我認爲解決這個最簡單的方法是使用Oracle的內置rownum變量,然後使用整數除法(確定行)和mod()確定列:

SELECT MAX(CASE WHEN mod(seqnum, 3) = 0 THEN name END) as col1, 
     MAX(CASE WHEN mod(seqnum, 3) = 1 THEN name END) as col2, 
     MAX(CASE WHEN mod(seqnum, 3) = 2 THEN name END) as col3 
FROM (SELECT name, rownum as seqnum 
     FROM profile 
    ) t 
GROUP BY trunc((seqnum - 1)/3) 
相關問題