Не могу правильно использовать регистр и агрегацию - PullRequest
0 голосов
/ 05 июня 2019

У меня есть следующая таблица

Cash_table

ID          Cash   Rates  Amount
1           50     3      16
2           100    4      25
3           130    10     7
3           130    10     6
4           13     7      1.8
5           30     8      2.5
5           30     10     1
6           10     5      2

В результате я хочу собрать все записи, имеющие Count (id)> 1 примерно так:

ID          New_Cash         New_Rates  New_Amount
1           50               3           16
2           100              4           25
3           130              10+10       130/(10+10)
4           13               7           1.8
5           30               8+10        30/(8+10)
6           10               5           2

Поэтому я хочу изменить только те строки, в которых Count (id)> 1, и оставить остальные, как было.

Длястроки с count (id)> 1 Я хочу суммировать ставки и взять наличные и разделить их на сумму ставок.Тарифы сами по себе не являются проблемой, поскольку я могу суммировать их, группировать по идентификатору и получать желаемый результат.

Проблема со столбцом New_Amount:

Я пытаюсь это сделатьс указанием регистра, но он не работает:

   select id, 
   cash as new_cash,
   sum(rates) as new_rates,
   (case count(id)
   when 1 then amount 
   else cash/sum(nvl(rates,null))
   end) as new_amount
   from Cash_table
   group by id

1 Ответ

1 голос
/ 05 июня 2019

Так как денежная стоимость для идентификатора всегда одинакова, вы также можете сгруппировать по ней:

select id, 
  cash as new_cash,
  sum(rates) as new_rates,
  case count(id)
    when 1 then max(amount)
    else cash/sum(rates)
  end as new_amount
from cash_table
group by id, cash
order by id

        ID   NEW_CASH  NEW_RATES NEW_AMOUNT
---------- ---------- ---------- ----------
         1         50          3         16
         2        100          4         25
         3        130         20        6.5
         4         13          7        1.8
         5         30         18 1.66666667
         6         10          5          2

Первая ветвь выражения case нуждается в агрегате, потому что вы не группируете по количеству; и sum(nvl(rates,null)) может быть просто sum(rates). Если вы ожидаете нулевые ставки, вам нужно решить, как вы хотите обрабатывать сумму, но nvl(rates,null) ничего не делает.

Вы можете сделать то же самое без выражения регистра, если хотите, манипулируя всеми значениями - что может быть дороже:

select id, 
  cash as new_cash,
  sum(rates) as new_rates,
  sum(amount * rates)/sum(rates) as new_amount
from cash_table
group by id, cash
order by id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...