sql - 具有多个条件的 Oracle SQL Group by 和 sum
问题描述
我附上了两个表的捕获:
- 左表是其他“选择”查询
的结果 - 右表是我想要的左表结果
可以按照以下条件创建正确的表:
当相同
Unit
的能量值全部为正或全部为负 时,结果保持不变当相同
Unit
具有正能量值和负能量值时:- 将所有能量相加
Unit
(-50+15+20 = -15),然后取能量绝对值的最大值。e.g. max(abs(energy))=50
并为该值取价。
- 将所有能量相加
我使用 SQL ORACLE。
我非常感谢在这件事上的帮助!
解决方案
这将返回所需的结果:
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))
值。
推荐阅读
- java - 如何避免在代码中硬编码数据库凭据
- javascript - 'OnClick' 功能在第一次点击时未运行,需要第二次点击
- c# - 如何将所有变量值推送到列表
- algorithm - 是否对 Marching Squares 算法进行了调整以使其对受限输入进行无损压缩?
- c++ - 如何将 libm.so 和 libdl.so 与我的 bazel 项目链接?
- java - 如何读取 http 响应正文中的加密消息?
- python - 在 Python 3.5 中,无法导入 zenity
- php - 在php中的while函数中显示最小值
- java - 如何将数据库中的日期转换为 ZonedDateTime?
- sql - 当系列更改时,查找列中连续系列的最小最大值