Самостоятельное соединение таблиц в Oracle 11g - PullRequest
0 голосов
/ 08 июня 2019

Предположим, у меня есть таблица, полученная в результате запроса, подобного следующему:

+-------+-----+--------------------+-----+--------------------+
|CODE   |CURR |FRONT-END CHARGE    |CCY  |BACK-END CHARGE     |
+-------+-----+--------------------+-----+--------------------+
|002    |AUD  |5.25                |PHP  | 3.75               |
|002    |AUD  |1.75                |USD  | 1.25               |
|002    |BGN  |  14                |PHP  | 8.75               |
|002    |BGN  |   6                |USD  | 3.75               |
|002    |BND  | 9.5                |PHP  |  8.5               |
|002    |BND  |4.25                |USD  |12.75               |
|002    |CAD  |12.5                |USD  | 6.75               |
|002    |INR  |  35                |PHP  |22.75               |
|002    |INR  |  25                |USD  |16.25               |
|002    |YEN  |55.5                |PHP  |16.55               |
|002    |YEN  |77.5                |USD  | 39.2               |
+-------+-----+--------------------+-----+--------------------+

Но я хочу получить такой результат:

+-------+-----+--------------------+-----+--------------------+
|CODE   |CURR |FRONT-END CHARGE    |CCY  |BACK-END CHARGE     |
+-------+-----+--------------------+-----+--------------------+
|002    |AUD  |7                   |PHP  | 3.75               |
|002    |     |                    |USD  | 1.25               |
|002    |BGN  |20                  |PHP  | 8.75               |
|002    |     |                    |USD  | 3.75               |
|002    |BND  |13.75               |PHP  |  8.5               |
|002    |     |                    |USD  |12.75               |
|002    |CAD  |12.5                |USD  | 6.75               |
|002    |INR  |60                  |PHP  |22.75               |
|002    |     |                    |USD  |16.25               |
|002    |YEN  |133                 |PHP  |16.55               |
|002    |     |                    |USD  | 39.2               |
+-------+-----+--------------------+-----+--------------------+

Обратите внимание, что интерфейсный сборэто сумма всех сборов по каждой валюте.

Я пытался использовать coalesce, но при выборе он возвращает ту же таблицу.Я также попытался самостоятельно присоединиться, но сумма на каждом из обвинений становится различной.Это в оракуле 11 г

1 Ответ

0 голосов
/ 08 июня 2019

Этот тип преобразования обычно следует выполнять на уровне представления - поскольку результаты на самом деле не являются таблицей SQL: в строках отсутствуют значения столбцов.

Но вы можете сделать это с помощью оконных функций:

select code,
       (case when row_number() over (partition by code, curr order by front_end_charge desc) = 1
             then code
        end) as code,
       (case when row_number() over (partition by code, curr order by front_end_charge desc) = 1
             then sum(front_end_charge) over (partition by code, curr)
        end) as front_end_charge,
       ccy, back_end_charge
from t
order by t.code, t.curr, t.front_end_charge desc;

Важно, чтобы внешние order by соответствовали order by в выражениях row_number().SQL-запросы возвращают результаты только в определенном порядке, если присутствует order by.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...