2012-09-18 91 views
1

對此有一些疑問,但我找不到相關的結果。我有一個查詢,讓我結果2列:Oracle SQL:將列轉置爲行

Day   Tot_dLS 
01-Sep-12  10000 
02-Sep-12  9920 

我要轉的日期,所以它讀取:

01-Sep-12 02-Sep-12 
10000   9920 

這可能嗎?

+0

您是否知道在編譯時將返回兩行(或任何固定數量的行),並且所需的兩列名稱是「01-Sep-12」和「02-Sep-12」 「?你是否需要這些列名稱,或者你可以使用通用列名稱? –

+0

http://www.club-oracle.com/forums/pivoting-row-to-column-conversion-techniques-sql-t144/一路下來讀取 –

+0

@JustinCave上面的例子更通用,我的實際結果行可以有10,20,30個不同的日期。我不一定需要列名讀取日期,以回答你的問題。 – Americo

回答

1

既然你可以返回列的固定號碼,您可以使用通用列名,你可以做一個標準的支點查詢

SELECT max(case when rn = 1 then tot_dls else null end) col_1, 
     max(case when rn = 2 then tot_dls else null end) col_2, 
     max(case when rn = 3 then tot_dls else null end) col_3, 
     <<25 more>> 
     max(case when rn = 29 then tot_dls else null end) col_29, 
     max(case when rn = 30 then tot_dls else null end) col_30 
    FROM (SELECT day, 
       tot_dls, 
       rank() over (order by day) rn 
      FROM your_table 
     WHERE day between date '2012-09-01' 
         and date '2012-09-02' -- Use whatever criteria you want here 
     ) 
+0

哪裏說<<25 more>>這是否需要我的手動輸入?它似乎沒有按原樣查詢。 – Americo

+2

@Stuav - 是的。我放棄了25行,你可以通過'col_29'生成'col_4',就像我通過'col_3'執行'col_1'一樣。您需要明確列出這些內容,我將它們關閉以避免混淆我的答案。 –

0

您可以使用CASE語句和聚合來執行此操作。您可以使用這樣的事情:

select max(case when day = '01-Sep-12' then Tot_dLS end) "01-Sep-12", 
     max(case when day = '02-Sep-12' then Tot_dLS end) "02-Sep-12", 
     ........ add more columns here 
from yourtable 

那麼這將擴大到添加更多的列。

1

由於同一列必須包含兩種不同的數據類型,所以並非真正使用SQL查詢。您可以通過一些技巧(將所有內容都轉換爲字符串) - 但是在演示應用程序或報表本身中完成這些工作要比查詢更好。

+0

有沒有存儲庫可以瞭解有關此策略的更多信息?因爲如果我有多個結果行,看起來其他策略可能會變得冗餘且耗時。謝謝! – Americo

1

此代碼:

create table your_table(day date, tot_dls number(5)); 
insert into your_table values ('01-SEP-2012',10000); 
insert into your_table values ('02-SEP-2012',9920); 
insert into your_table values ('03-SEP-2012',12020); 
insert into your_table values ('04-SEP-2012',11030); 

column dummy noprint 
column "Header" format a7 
column "Data" format a60 
set hea off 
SELECT 0 DUMMY 
     ,'Day'          "Header" 
     ,LISTAGG(' ' || TO_CHAR(Day,'DD-MON-YYYY')) WITHIN GROUP (ORDER BY Day) "Data" 
FROM your_table 
UNION 
SELECT 1 
     ,'Tot_dls' 
     ,LISTAGG(LPAD(TOT_DLS,13-LENGTH(TO_CHAR(TOT_DLS,'FM')),' ')) WITHIN GROUP (Order by Day) 
FROM your_table 
ORDER by 1; 

生產使用SQL此輸出* Plus在Oracle 11g(11.2.0)數據庫上。

Day  01-SEP-2012 02-SEP-2012 03-SEP-2012 04-SEP-2012 
Tot_dls  10000  9920  12020  11030