Oracle SQL Группировка по сумме с несколькими условиями - PullRequest
0 голосов
/ 07 января 2020

enter image description here

Я прикрепил захват двух таблиц:
- левая таблица является результатом других запросов "Выбрать"
- правая таблица результат, который я хочу получить из левой таблицы

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

  1. Когда одинаковые Unit имеют все положительные или все отрицательные значения энергии, результат остается тем же

  2. Когда одинаковые Unit имеют положительных и отрицательных значений энергии, то :

    • Сделайте сумму всей энергии для этого Unit (- 50 + 15 + 20 = -15), а затем возьмите максимальное абсолютное значение для энергии. e.g. max(abs(energy))=50 и возьмите цена за это значение.

Я использую SQL ORACLE.

Я очень ценю помощь в этом вопросе!

http://sqlfiddle.com/#! 4 / eb85a / 12

Ответы [ 2 ]

1 голос
/ 07 января 2020

Возвращает желаемый результат:

  • signs CTE выясняет, есть ли положительные / отрицательные значения, а также максимальное значение энергии ABS
  • , тогда существует объединение двух выбирает: ту, которая возвращает «исходные» строки (если число отличительных знаков равно 1), и ту, которая возвращает «вычисленные» значения, как вы описали

SQL> with
  2  signs as
  3    (select unit,
  4            count(distinct sign(energy)) cnt,
  5            max(abs(energy)) max_abs_ene
  6     from tab
  7     group by unit
  8    )
  9  select t.unit, t.price, t.energy
 10    from tab t join signs s on t.unit = s.unit
 11    where s.cnt = 1
 12  union all
 13  select t.unit, t2.price, sum(t.energy)
 14    from tab t join signs s on t.unit = s.unit
 15    join tab t2 on t2.unit = s.unit and abs(t2.energy) = s.max_abs_ene
 16    where s.cnt = 2
 17    group by t.unit, t2.price
 18  order by unit;

UNIT                      PRICE     ENERGY
-------------------- ---------- ----------
A                            20        -50
A                            50        -80
B                            13        -15

SQL>

Хотя, что делать Вы ожидаете, что будет еще одна строка "B" с energy = +50? Тогда две строки будут иметь одинаковое значение MAX(ABS(ENERGY)).

0 голосов
/ 07 января 2020

A union all может быть самым простым решением:

with t as (
      select t.*,
             max(energy) over (partition by unit) as max_energy,
             min(energy) over (partition by unit) as min_energy
      from t
     ) 
select unit, price, energy
from t
where max_energy > 0 and min_energy > 0 or
      max_energy < 0 and min_enery < 0
union all
select unit,
       max(price) keep (dense_rank first order by abs(energy)),
       sum(energy)
from t
where max_energy > 0 and min_energy < 0
group by unit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...