Oracle: объединить две строки значений в одну строку с новыми именами столбцов - PullRequest
0 голосов
/ 12 сентября 2018

Я использую версию базы данных Oracle 12c.

select id,currency_code,currency_classification_code,amount from table;

ДАННЫЕ:

id   currency_code    currency_classification_code    Amount
1    USD              Reporting                       111111
1    AUD              BASE                            222222

Ожидаемый результат:

id   Amt_in_base_curncy  base_curncy_code  Amt_in_rptng_curncy rptng_curncy_code
1    222222              AUD               111111              USD

Я хочу данныев вышеуказанном формате, создав четыре новых столбца.

, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Пожалуйста, помогите.

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Именно для такого рода проблем Oracle имеет PIVOT -запросы:

select *
  from (select id,currency_code,currency_classification_code,amount from table)
  pivot (sum(amount) as amt_in
        ,max(currency_code) as code 
     for (currency_classification_code) in ('BASE' as base_curncy, 'Reporting' as rptng_curncy))
0 голосов
/ 12 сентября 2018

Одним из способов является условное агрегирование:

select id, 
max(case when currency_classification_code = 'BASE' then Amount end) as Amt_in_base_curncy,
max(case when currency_classification_code = 'BASE' then currency_code end) as base_curncy_code,
max(case when currency_classification_code = 'Reporting' then Amount end) as Amt_in_rptng_curncy,
max(case when currency_classification_code = 'Reporting' then currency_code end) as rptng_curncy_code
from t
group by id
0 голосов
/ 12 сентября 2018

Пойдем другим путем:

Если вы не можете быть уверены, что во всех случаях у вас будут ОБА и «БАЗА», и строка «Отчетность» для каждого идентификатора, вам потребуется использовать ПОЛНОЕ СОЕДИНЕНИЕ для объединения данных:

WITH cteBase AS (SELECT *
                   FROM YOUR_TABLE
                   WHERE CURRENCY_CLASSIFICATION_CODE = 'BASE'),
     cteReporting AS (SELECT *
                        FROM YOUR_TABLE
                        WHERE CURRENCY_CLASSIFICATION_CODE = 'Reporting')
SELECT COALESCE(b.ID, r.ID) AS ID,
       b.AMOUNT AS Amt_in_base_curncy,
       b.CURRENCY_CODE AS base_curncy_code,
       r.AMOUNT AS Amt_in_rptng_curncy,
       r.CURRENCY_CODE AS rptng_curncy_code
  FROM cteBase b
  FULL OUTER JOIN cteReporting r
    ON r.ID = b.ID
0 голосов
/ 12 сентября 2018

Вы можете использовать join, например:

select tb.id, tb.amount, tb.currency_code, tr.amount, tr.currency_code
from t tr join
     t tb
     on tr.id = tb.id and tr.currency_classification_code = 'Reporting' and
        tb.currency_classification_code = 'BASE';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...