首页 > 解决方案 > 具有多个条件的 Oracle SQL Group by 和 sum

问题描述

在此处输入图像描述

我附上了两个表的捕获:
- 左表是其他“选择”查询
的结果 - 右表是我想要的左表结果

可以按照以下条件创建正确的表:

  1. 当相同Unit的能量值全部为正全部为负 时,结果保持不变

  2. 当相同Unit具有正能量值和负能量值时:

    • 将所有能量相加Unit(-50+15+20 = -15),然后取能量绝对值的最大值。e.g. max(abs(energy))=50并为该值取价。

我使用 SQL ORACLE。

我非常感谢在这件事上的帮助!

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

标签: sqloraclegroup-by

解决方案


这将返回所需的结果:

  • signsCTE找出是否有正/负值,以及最大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))值。


推荐阅读