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,那么是时候为您更改查询了。

我使用MAX了在多行中只选择一个值的函数,其余的值应该是null.

我希望这有帮助。

于 2013-02-07T15:09:23.743 回答