sql - Oracle 11g 中的自联接表
问题描述
假设我有一个这样的查询产生的表:
+-------+-----+--------------------+-----+--------------------+
|CODE |CURR |FRONT-END CHARGE |CCY |BACK-END CHARGE |
+-------+-----+--------------------+-----+--------------------+
|002 |AUD |5.25 |PHP | 3.75 |
|002 |AUD |1.75 |USD | 1.25 |
|002 |BGN | 14 |PHP | 8.75 |
|002 |BGN | 6 |USD | 3.75 |
|002 |BND | 9.5 |PHP | 8.5 |
|002 |BND |4.25 |USD |12.75 |
|002 |CAD |12.5 |USD | 6.75 |
|002 |INR | 35 |PHP |22.75 |
|002 |INR | 25 |USD |16.25 |
|002 |YEN |55.5 |PHP |16.55 |
|002 |YEN |77.5 |USD | 39.2 |
+-------+-----+--------------------+-----+--------------------+
但我想得到这样的结果:
+-------+-----+--------------------+-----+--------------------+
|CODE |CURR |FRONT-END CHARGE |CCY |BACK-END CHARGE |
+-------+-----+--------------------+-----+--------------------+
|002 |AUD |7 |PHP | 3.75 |
|002 | | |USD | 1.25 |
|002 |BGN |20 |PHP | 8.75 |
|002 | | |USD | 3.75 |
|002 |BND |13.75 |PHP | 8.5 |
|002 | | |USD |12.75 |
|002 |CAD |12.5 |USD | 6.75 |
|002 |INR |60 |PHP |22.75 |
|002 | | |USD |16.25 |
|002 |YEN |133 |PHP |16.55 |
|002 | | |USD | 39.2 |
+-------+-----+--------------------+-----+--------------------+
请注意,前端费用是每种货币的各项费用的总和。
我尝试使用合并,但在选择时它返回同一个表。我也尝试了自我加入,但每项费用的总和变得不同。这是在 oracle 11g 中
解决方案
这种类型的转换通常应该在表示层中完成——因为结果并不是真正的 SQL 表:行缺少列值。
但是,您可以使用窗口函数执行此操作:
select code,
(case when row_number() over (partition by code, curr order by front_end_charge desc) = 1
then code
end) as code,
(case when row_number() over (partition by code, curr order by front_end_charge desc) = 1
then sum(front_end_charge) over (partition by code, curr)
end) as front_end_charge,
ccy, back_end_charge
from t
order by t.code, t.curr, t.front_end_charge desc;
外部与表达式中的order by
匹配很重要。SQL 查询仅在存在时以确定的顺序返回结果。order by
row_number()
order by
推荐阅读
- linux - fIm 试图在两个匹配模式之间找到一个字符串,然后使用 sed 在一个模式之前添加该字符串
- flutter - flt_telephony_info 得到空结果
- apache-kafka - Google Cloud Spanner 通过 Cloud Data Fusion 或其他方式实时更改数据捕获到 PubSub/Kafka
- python - 如何动态确定要创建哪个 Python 子类?
- pandas - 使用多索引数据框绘图
- c++ - 通过指针C++调用成员函数,对象为空?
- amazon-web-services - 同步阶跃函数 lambda 映射迭代器
- python - 使用 boto3 扫描 DynamoDB
- visual-studio - Visual Studio 2017 的 ESLint 不会显示任何错误
- reactjs - 无法编译 src\App.js 行 66:12: 'oldstate' is not defined no-undef