gpt4 book ai didi

sql - 在 Oracle 10g 中将行旋转到列

转载 作者:行者123 更新时间:2023-12-02 06:08:18 25 4
gpt4 key购买 nike

我有一些查询,返回以下数据:

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) )

最佳答案

我必须在这里提到 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

我希望这会有所帮助。

关于sql - 在 Oracle 10g 中将行旋转到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14565826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com