2

我有一个简单的问题需要快速解决。你能借给我你的帮助吗?

问题如下:我有两张表,一张定义表和一张历史表。

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 小型货车巴士
sysdate 100 150 100
sysdate-1 200 150 200
sysdate-2 100 150 100

我知道我可以通过使用解码或 11g 枢轴来做到这一点。但对于那些我需要提前知道收入类型(汽车、小型货车等)的人,每次定义时我都需要更新我的代码。如果可能的话,我想避免这种情况。

欢迎大家提出意见,

谢谢。

4

3 回答 3

2

听起来像是动态 sql 的候选者。每次运行查询时,您都需要将 sql 语句实际构建为字符串。您可以通过从定义表中进行选择、循环定义并将它们添加到您的 sql 语句中来构建列名字符串,然后:

execute immediate 'sql statement'

我知道没有其他方法可以动态更改查询运行时显示的列。

于 2012-06-06T20:21:54.427 回答
2

此代码在 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-10-16T15:19:07.450 回答
0

您可以让函数将定义的内容作为单行输出 - 将其连接回定义和历史记录,应该返回您想要的内容并根据定义中的数据更改进行调整。

一个例子: http ://docs.oracle.com/cd/E18283_01/appdev.112/e17126/tuning.htm#BABIEICA

于 2012-06-06T20:49:20.520 回答