對此有一些疑問,但我找不到相關的結果。我有一個查詢,讓我結果2列:Oracle SQL:將列轉置爲行
Day Tot_dLS
01-Sep-12 10000
02-Sep-12 9920
我要轉的日期,所以它讀取:
01-Sep-12 02-Sep-12
10000 9920
這可能嗎?
對此有一些疑問,但我找不到相關的結果。我有一個查詢,讓我結果2列:Oracle SQL:將列轉置爲行
Day Tot_dLS
01-Sep-12 10000
02-Sep-12 9920
我要轉的日期,所以它讀取:
01-Sep-12 02-Sep-12
10000 9920
這可能嗎?
既然你可以返回列的固定號碼,您可以使用通用列名,你可以做一個標準的支點查詢
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
)
哪裏說<<25 more>>這是否需要我的手動輸入?它似乎沒有按原樣查詢。 – Americo
@Stuav - 是的。我放棄了25行,你可以通過'col_29'生成'col_4',就像我通過'col_3'執行'col_1'一樣。您需要明確列出這些內容,我將它們關閉以避免混淆我的答案。 –
您可以使用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
那麼這將擴大到添加更多的列。
由於同一列必須包含兩種不同的數據類型,所以並非真正使用SQL查詢。您可以通過一些技巧(將所有內容都轉換爲字符串) - 但是在演示應用程序或報表本身中完成這些工作要比查詢更好。
有沒有存儲庫可以瞭解有關此策略的更多信息?因爲如果我有多個結果行,看起來其他策略可能會變得冗餘且耗時。謝謝! – Americo
此代碼:
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
您是否知道在編譯時將返回兩行(或任何固定數量的行),並且所需的兩列名稱是「01-Sep-12」和「02-Sep-12」 「?你是否需要這些列名稱,或者你可以使用通用列名稱? –
http://www.club-oracle.com/forums/pivoting-row-to-column-conversion-techniques-sql-t144/一路下來讀取 –
@JustinCave上面的例子更通用,我的實際結果行可以有10,20,30個不同的日期。我不一定需要列名讀取日期,以回答你的問題。 – Americo