【问题标题】:Oracle SQL Group by and sum with multiple conditions具有多个条件的 Oracle SQL Group by 和 sum
【发布时间】:2020-01-07 18:35:48
【问题描述】:

我附上了两张表格的截图:
- 左表是其他人“选择”查询的结果
- 右表是我想要从左表得到的结果

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

  1. 当同一个Unit全正面全负面 能量值,结果保持不变

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

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

我使用 SQL ORACLE。

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

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

【问题讨论】:

  • B 的绝对价格的最大值是 16 而不是 13。
  • @forpas max(abs(-50,15,20)) = 50,该值的价格为 13
  • 现在你澄清了,但在问题中这并不清楚。
  • @forpas 确实不清楚。现在我更正了。

标签: sql oracle group-by


【解决方案1】:

这将返回所需的结果:

  • 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>

不过,如果还有另一个带有energy = +50 的“B”单元行,您会期待什么?然后两行将具有相同的MAX(ABS(ENERGY)) 值。

【讨论】:

  • 感谢您的回答。它工作得很好。关于你的问题,这种情况从未发生过,我希望它会保持这样:)
【解决方案2】:

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;

【讨论】:

  • 感谢您的努力。你知道为什么我无法验证小提琴中的查询吗?http://sqlfiddle.com/#!4/eb85a/12。它说:“递归 WITH 子句必须有列别名列表”
  • @BOB 。 . .这解决了这个问题中提出的问题。我认为不需要递归查询。如果您对该代码有其他问题(并且该错误似乎不言自明),请作为另一个问题提出。
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
相关资源
最近更新 更多