2016-02-16 71 views
1

沒關係..我在Oracle 10g上,這意味着更新的Oracle版本或其他SQL版本的簡易concat函數都不起作用。水平輸出sql數據

我正在查看一列(process_date)中有重複的表(工資單)。該數據庫是Oracle數據庫。

例如表工資:

Yr | Week | Process_date 
15  53  12/19/2015 
15  52  12/19/2015 
15  51  12/7/2015 

我想輸出返回與在這樣

Yr | Week 1| Week 2 | Process_date 
15  53  52  12/19/2015 

我同一直線上週數有同樣的處理日期的周已經嘗試了各種子選擇和連接,但不能正確地做。

編輯:添加細節 EDIT2:截至話題

+0

?這聽起來像是你想「旋轉」你的結果。如果知道潛在列的數量,有幾種方法可以根據rdbms執行此操作。如果你不知道列的數量,那麼你需要使用'動態sql'。 – sgeddes

+0

這是一個交叉表或數據透視查詢。如何做到這一點將取決於你正在使用的RDBMS。你應該更新你的問題來標記RDBMS(mysql vs sql-server vs postgresql vs ...) – JNevill

+0

@sgeddes,這正是我試圖避免的。我可以將結果導出爲ex​​cel並將其轉到那裏..對我來說更容易 –

回答

1
SELECT Yr, GROUP_CONCAT(Week SEPARATOR ',') Weeks, Process_date 
FROM payroll 
GROUP BY Yr, Process_date; 

這會給你以下的輸出:

Yr | Weeks | Process_date 
15 53,52 12/19/2015 

如果必須在單獨的列得到他們,你可能需要一個子查詢作爲跟隨。如果您只有一週而不是兩個,此查詢將無法正常工作。

SELECT Yr, SUBSTRING_INDEX(SUBSTRING_INDEX(Weeks, ',', 1), ',', -1) Week1, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(Weeks, ',', 2), ',', -1) Week2, Process_date 
FROM 
    (SELECT Yr, GROUP_CONCAT(Week SEPARATOR ',') Weeks, Process_date 
    FROM payroll 
    GROUP BY Yr, Process_date) merged_payroll; 

輸出:

Yr | Weeks | Process_date 
15 53,52 12/19/2015 
15 51,51 12/7/2015 (DUPLICATED 51) 

參考:(1)How to use GROUP_CONCAT in a CONCAT in MySQL(2)Split value from one field to two您正在使用哪個數據庫

+0

這個'SELECT Yr,GROUP_CONCAT(Week SEPARATOR',')Weeks,Process_date'給了我這個錯誤'ORA-00907 :缺少右括號# –

+0

Nevermind ..我在Oravle 10g上,這意味着非新版Oracle或其他SQL版本的簡易concat函數將起作用。感謝您的幫助。 –