2

次の列を持つテーブルがあります

  • End_date.
  • count_all_transactions.
  • count_timeouts.
  • request_key.

percentagetimeoutここで、2 つの異なる日付を計算し、それらを同時に表示する必要があります。クエリを作成しました。

私のクエリは次のとおりです。

Select PercentageTimeout ,
  PerTimeout,
  Transaction
From 
(
  select 
    T.COUNT_ALL_TRANSACTIONS as Total,
    T.END_DATE as DT1,
    T.COUNT_TIMEOUTS as Timeouts,
    round (((T.COUNT_TIMEOUTS / T.COUNT_ALL_TRANSACTIONS) * 100)
             ,2) as PercentageTimeout,
    R.INTERFACE_NAME as Transaction
  from rpt_timeout T, dim_request R
  where
    T.REQUEST_KEY = R.REQUEST_KEY
  AND
    T.END_DATE='27 AUG 2012'
) 
left outer join 
(
  select T1.COUNT_ALL_TRANSACTIONS as Total1,
    T1.END_DATE as DT2,
    T1.COUNT_TIMEOUTS as Timeouts1,
    round (((T1.COUNT_TIMEOUTS / T1.COUNT_ALL_TRANSACTIONS) * 100)
             ,2) as PerTimeout,
    R1.INTERFACE_NAME as Transaction1
  from rpt_timeout T1, dim_request R1
  where T1.REQUEST_KEY = R1.REQUEST_KEY
  AND T1.END_DATE='20 AUG 2012'
) on Transaction = Transaction1;

このクエリは私に正しい結果を与えていますが、私が苦労しているのは、そのテーブルの対応する END_DATE として列の名前が必要なことです。つまり、私の出力は次のようになります

27-AUG-2012   20-AUG-2012  Transaction
0.28          0.1          Qpay 
0.09          0.06         Payment
4

1 に答える 1

0

これには動的SQLを使用する必要があります。これはOracleに固有であるため、PL / SQLを使用してクエリを作成し、EXECUTEIMMEDIATEステートメントで実行することを意味します。

以下のリンクを参照してください...

http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

これがいくつかのサンプルコードです。これは完全ではなく、構文的に正しくない場合もあります(Oracleサーバーが手元になく、しばらくの間Oracleと連携していません)。これは、私が話していることを理解するための断片です。

DECLARE
  query VARCHAR2(4000);
  date1 VARCHAR2(25);
  date2 VARCHAR2(25);
BEGIN
  date1 := '27-AUG-2012';
  date2 := '20-AUG-2012';
  query := 'Select PercentageTimeout as ' || date1 ||
           ', PerTimeout as ' || date2 ||
           ',   Transaction From  <the rest of your query goes here>';

  EXECUTE IMMEDIATE query;
END;

ここで、動的に構築されたクエリ文字列から代わりにカーソルを作成し、レコードを反復処理することをお勧めします。あなたがする必要があることは何でも。重要な点は、クエリで列エイリアスを動的に指定する場合は、そのクエリを動的に作成する必要があるということです。

于 2012-10-10T20:15:04.200 に答える