【问题标题】:Self Join Table in Oracle 11gOracle 11g 中的自联接表
【发布时间】:2019-06-08 10:00:32
【问题描述】:

假设我有一个这样的查询产生的表:

+-------+-----+--------------------+-----+--------------------+
|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 oracle oracle11g


    【解决方案1】:

    这种类型的转换通常应该在表示层完成——因为结果并不是真正的 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 byrow_number() 表达式中的order by 匹配很重要。 SQL 查询仅在存在order by 时以确定的顺序返回结果。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多