我有一个简单的问题,我需要尽快解决。你能帮我一下吗?
问题是fOllows:我有两个表,一个定义表和一个历史表。
create table revenue history(operation_date date, revenue_id number, total_revenue number);
create table revenue_definition(revenue_id number, revenue_name varchar2(100));
insert into revenue_definition values(1,'Car');
insert into revenue_definition values(2,'Minivan');
insert into revenue_definition values(3,'Bus');
insert into revenue history values(sysdate-2,1,100);
insert into revenue history values(sysdate-2,2,150);
insert into revenue history values(sysdate-2,3,100);
insert into revenue history values(sysdate-1,1,200);
insert into revenue history values(sysdate-1,2,150);
insert into revenue history values(sysdate-1,3,200);
insert into revenue history values(sysdate,1,100);
insert into revenue history values(sysdate,2,150);
insert into revenue history values(sysdate,3,100);现在我要做的是展示这样一份报告;
operation_date小型客车
系统100 150 100
系统-1 200 150 200
sysdate-2 100 150 100
我知道,我可以通过使用解码或11g枢轴来实现这一点。但对于那些我需要知道的收入类型(汽车,小型货车等)预先和每次定义时,我需要更新我的代码。如果可能的话,我想避免这样做。
任何建议都欢迎,
谢谢。
发布于 2012-06-06 20:21:54
听起来像是动态sql的候选。每次运行查询时,都需要将sql语句实际构建为字符串。您可以通过从definition表中选择、循环这些定义并将它们添加到sql语句中来构建列名字符串,然后:
execute immediate 'sql statement'我知道没有其他方法可以动态更改查询运行时显示的列。
发布于 2012-10-16 15:19:07
此代码在Oracle 11g (11.2.0)数据库上的SQL*Plus中运行。
column dummy noprint
column "Header" format a14
column "Data" format a40
SELECT 0 DUMMY
,'Operation Date' "Header"
,LISTAGG(lpad(' ', 9 - length(d.revenue_name) ,' ') || d.revenue_name ) WITHIN GROUP (ORDER BY d.revenue_id) "Data"
FROM revenue_definition d
UNION
SELECT 1
,to_Char(h.operation_date,'DD-MON-YYYY')
,LISTAGG(lpad(' ',9 - length(h.total_revenue),' ') ||h.total_revenue) WITHIN GROUP (Order by d.revenue_id)
FROM revenue_definition d
,revenue_history h
where h.revenue_id = d.revenue_id
group by h.operation_date
ORDER by 1, 2;并产生这样的输出:
Header Data
-------------- ----------------------------------------
Operation Date Car Minivan Bus
15-OCT-2012 100 150 100
16-OCT-2012 200 150 200
17-OCT-2012 100 150 100发布于 2012-06-06 20:49:20
您可以有一个函数将定义的内容作为一个单独的行-连接返回到定义和历史,应该返回您想要的,并根据定义中的数据更改进行调整。
一个例子:http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/tuning.htm#BABIEICA
https://stackoverflow.com/questions/10921212
复制相似问题