对此有一些问题,但我找不到适合我的相关结果。我有一个查询,它给了我 2 列结果:
Day Tot_dLS
01-Sep-12 10000
02-Sep-12 9920
我想转置日期,使其显示为:
01-Sep-12 02-Sep-12
10000 9920
这可能吗?
不是真的使用 SQL 查询,因为同一列必须包含两种不同的数据类型。您可以通过一些技巧(将所有内容转换为字符串)来解决问题 - 但是在演示应用程序或报告本身中比在查询中完成这些事情要好得多。
由于您可以返回固定数量的列并且可以使用通用列名,因此您可以执行标准的数据透视查询
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
)
这段代码:
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;
在 Oracle 11g (11.2.0) 数据库上使用 SQL*Plus 生成此输出。
Day 01-SEP-2012 02-SEP-2012 03-SEP-2012 04-SEP-2012
Tot_dls 10000 9920 12020 11030
您可以使用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
然后这将被扩展以添加更多列。