2

すぐに解決する必要がある単純な問題があります。私にあなたの助けを貸していただけませんか?

問題は次のとおりです。定義テーブルと履歴テーブルの 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

これは、decode または in 11g ピボットを使用して実行できることを知っています。しかし、事前に収益の種類 (車、ミニバンなど) を知る必要があり、定義が作成されるたびにコードを更新する必要があります。できればこれは避けたい。

どんな提案でも大歓迎です、

ありがとう。

4

3 に答える 3

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 に答える
2

動的SQLの候補のように聞こえます。クエリを実行するたびに、SQL ステートメントを文字列として実際に作成する必要があります。定義テーブルから選択を行い、定義をループしてそれらを SQL ステートメントに追加することで、列名の文字列を作成できます。

execute immediate 'sql statement'

クエリの実行時に表示される列を動的に変更する方法は他にありません。

于 2012-06-06T20:21:54.427 に答える