我有一些查询,它返回以下数据:
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
正如您所看到的,此查询描述了refence的费率。每个费率取决于金额(t_rest)和持续时间(t_term和t_term_max)。我需要将所有费率分为1个refence和每种货币(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 )
答案 0 :(得分:0)
我必须在此提及Oracle不允许动态支点。你可以阅读它here。
我只能建议你可以通过查询使用静态枢轴。
我稍微修改了您的数据 - 我已使用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
。
我希望这会有所帮助。