Условный порядок на основе совокупного значения столбца в Oracle Sql Developer - PullRequest
1 голос
/ 07 ноября 2019

У меня есть таблица с идентификатором CW_savings, PW_Savings и Savings_Diff (CW-PW). Я хочу заказать таблицу в зависимости от суммы (Savings_Diff), если она> = 0, то Desc (сначала показывается наибольшее положительное различие), иначе asc (сначала показывается наибольшее различие -ve). В настоящее время я использую:

select ID, CW_savings, PW_Savings,Savings_Diff
from table 
order by case 
  when sum(savings_diff) >=0 then Savings_diff end DESC
  when sum(savings_diff) < 0 then SAvings_diff end ASC
;

Этот запрос не работает, потому что я считаю, что вы не можете использовать агрегатные функции в предложении Order by. Ищете способ обойти это?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Если сумма, которую вы хотите проверить, является общей суммой столбца Savings_Diff всех строк таблицы, то вы можете сделать это:

select t.ID, t.CW_savings, t.PW_Savings, t.Savings_Diff
from tablename t 
cross join (select sum(Savings_Diff) total from table) s   
order by -sign(s.total) * t.Savings_diff

Когда сумма положительна, тогдасортировка эквивалентна:

order by -Savings_diff

или

order by Savings_diff DESC

Если сумма отрицательная, тогда сортировка эквивалентна:

order by Savings_diff

или

order by Savings_diff ASC
0 голосов
/ 07 ноября 2019

Я собираюсь предположить, что id имеет несколько строк в таблице, и вы хотите сумму для id. Вы можете использовать оконные функции:

select ID, CW_savings, PW_Savings,Savings_Diff
from table 
order by (case when sum(savings_diff) over (partition by id) >= 0 then Savings_diff end) desc,
         (case when sum(savings_diff) over (partition by id) < 0 then savings_diff end) ASC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...