4

次のデータを返すクエリがあります。

T_REF   T_CUR_CODE   T_TERM   T_TERM_MAX   T_REST1   T_RATE1   T_REST2   T_RATE2   T_REST3    T_RATE3

1       RUR          181      365          5000      10,8      50000,01  11,1      500000,01  11,2
1       RUR          366      730          5000      11,4      50000,01  11,55     500000,01  11,6
1       USD          181      365          100       5,9       1500,01   6,1       20000,01   6,55
1       EUR          181      365          100       5,7       1500,01   5,9       20000,01   6
1       USD          366      730          100       6,3       1500,01   6,4       20000,01   6,6
1       EUR          366      730          100       6,05      1500,01   6,2       20000,01   6,3

ご覧のとおり、このクエリは参照用のレートを記述しています。各レートは、金額 (t_rest) と期間 (t_term および t_term_max) に依存します。1 つの参照と各通貨のすべてのレートをグループ化する必要があります (3 行、6 つのレート):

T_REF   T_CUR_CODE   T_RATE_1   T_TERM_1   T_TERM_MAX_1   T_REST_1   T_RATE_2   T_TERM_2   T_TERM_MAX_2   T_REST_2   T_RATE_3   T_TERM_3   T_TERM_MAX_3   T_REST_3   T_RATE_4   T_TERM_4   T_TERM_MAX_4   T_REST_4   T_RATE_5   T_TERM_5   T_TERM_MAX_5   T_REST_5   T_RATE_6   T_TERM_6   T_TERM_MAX_6   T_REST_6

1       RUR          10,8       181        365            5000       11,1       181        365            50000,01   11,2       181        365            500000,01  11,4       366        730            5000       11,55      366        730            50000,01   11,6       366        730            500000,01

ストアド プロシージャで動的クエリ (dbms_sql パッケージ) として使用し、クエリを生成する前に、各行のレート (このサンプル値は 3) と各通貨の異なる用語 (ここでは値は 2) を計算します。

4

1 に答える 1

0

ここで、Oracle では動的なピボットが許可されていないことに注意する必要があります。ここでそれについて読むことができます。

私が提案できるのは、クエリを介して静的ピボットを使用できるということだけです。

私はあなたのデータを少し変更しました - 私はT_REF通し番号として列を使用しました. これが私の解決策です:

WITH tbl AS (
SELECT 1 T_REF
       , 'RUR' T_CUR_CODE
       , 181 T_TERM
       , 365 T_TERM_MAX
       , 5000 T_REST1
       , '10,8' T_RATE1
       , '50000,01' T_REST2
       , '11,1' T_RATE2
       , '500000,01' T_REST3
       , '11,2' T_RATE3
FROM DUAL
UNION
SELECT 2, 'RUR', 366, 730, 5000, '11,4', '50000,01', '11,55', '500000,01', '11,6' FROM dual
UNION
SELECT 3, 'EUR', 181, 365, 100, '5,7', '1500,01', '5,9', '20000,01', '6' FROM dual
UNION
SELECT 4, 'EUR', 366, 730, 100, '6,05', '1500,01', '6,2', '20000,01', '6,3' FROM dual
UNION
SELECT 5, 'USD', 181, 365, 100, '5,9', '1500,01', '6,1', '20000,01', '6,55' FROM dual
UNION
SELECT 6, 'USD', 366, 730, 100, '6,3', '1500,01', '6,4', '20000,01', '6,6' FROM dual
)
SELECT t_cur_code
       , COUNT(*) AS cnt
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_RATE1 ELSE NULL END) AS t_rate_1
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_TERM ELSE NULL END) AS T_TERM_1
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_TERM_MAX ELSE NULL END) AS T_TERM_MAX_1
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_REST1 ELSE NULL END) AS T_REST_1
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_RATE2 ELSE NULL END) AS T_RATE_2
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_TERM ELSE NULL END) AS T_TERM_2
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_TERM_MAX ELSE NULL END) AS T_TERM_MAX_2
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_REST2 ELSE NULL END) AS T_REST_2
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_RATE3 ELSE NULL END) AS T_RATE_3
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_TERM ELSE NULL END) AS T_TERM_3
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_TERM_MAX ELSE NULL END) AS T_TERM_MAX_3
       , MAX(CASE MOD(t_ref, 2) WHEN 1 THEN T_REST3 ELSE NULL END) AS T_REST_3
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_RATE1 ELSE NULL END) AS t_rate_4
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_TERM ELSE NULL END) AS T_TERM_4
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_TERM_MAX ELSE NULL END) AS T_TERM_MAX_4
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_REST1 ELSE NULL END) AS T_REST_4
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_RATE2 ELSE NULL END) AS T_RATE_5
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_TERM ELSE NULL END) AS T_TERM_5
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_TERM_MAX ELSE NULL END) AS T_TERM_MAX_5
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_REST2 ELSE NULL END) AS T_REST_5
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_RATE3 ELSE NULL END) AS T_RATE_6
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_TERM ELSE NULL END) AS T_TERM_6
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_TERM_MAX ELSE NULL END) AS T_TERM_MAX_6
       , MAX(CASE MOD(t_ref, 0) WHEN 1 THEN T_REST3 ELSE NULL END) AS T_REST_6
FROM tbl
GROUP BY t_cur_code
;

これは長く見えるかもしれませんが、信じられないほど単純です。選択リストで使用COUNT(*)したので、そのためにいくつの行またはレコードがあるかがわかりますT_CUR_CODE。数が 2 でない場合は、クエリを変更する必要があります。

複数の行で 1 つの値のみを選択する関数を使用MAXしましたが、残りの値はnull.

これが役立つことを願っています。

于 2013-02-07T15:09:23.743 に答える