【问题标题】:How to merge two rows from a table into one in Oracle?如何在Oracle中将表中的两行合并为一行?
【发布时间】:2017-06-09 10:46:28
【问题描述】:

我有一个包含以下列和值的表格。

Name Rate Kind NoOfItems TotalAmount
---- ---- ---- --------- -----------
ABC     1 O           50          50
ABC     2 A           10          20

(*) 表有 N 个名字,种类是 O 或 A

我必须将上面的表格数据按如下方式输出到每个名称的一行中。

Name O_Rate A_Rate O_Items A_Items O_Amount A_Amount TotalItems TotalAmount
---- ------ ------ ------- ------- -------- -------- ---------- -----------
ABC       1      2      50      10       50       20         60          70

如何使用单个查询根据预期输出转换上述表格数据。我尝试过使用 Case 和 Decode,但在这两种情况下我只得到两行。

提前致谢。

【问题讨论】:

  • TotalAmount 是什么数据类型?在 Oracle 中 50$ 不存在,除了可能作为字符串 ('50$') 之外。如果是字符串,是否应该在添加值之前将其解释为美元金额?
  • @mathguy TotalAmount 字段的类型为 number(10),我在示例中添加的 $ 符号仅用于表示目的。

标签: sql oracle oracle12c


【解决方案1】:

我喜欢用条件聚合来做到这一点,但你也可以使用join

select o.name, o.Rate as o_Rate, a.Rate as a_Rate,
       o.Kind as o_Kind, a.Kind as a_Kind,
       o.NoOfItems as o_NoOfItems, a.NoOfItems as a_NoOfItems,
       o.TotalAmount as o_TotalAmount, a.TotalAmount as a_TotalAmount,
      (o.NoOfItems + a.NoOfItems) as TotalItems,
      (o.TotalAmount + a.TotalAmount) as TotalAmount
from t o join
     t a
     on o.name = a.name and o.rate = 'O' and a.rate = 'A';

【讨论】:

  • 缺少:总数。 (易于添加。)旋转(使用条件聚合或使用 PIVOT 运算符)的好处是基表只读取一次,而不是使用此 JOIN 解决方案两次 - 当然,也没有连接。
【解决方案2】:

从 Oracle 11.1 开始(我认为)您可以使用PIVOT 运算符,如下所示。

更好:看起来你所谓的“输入”实际上是一个中间结果,其他数据处理的输出。如果是这样,您也许可以将 PIVOT 操作与您已经在做的事情结合起来 - 没有理由将其作为一个单独的步骤,重复一些工作(以及一些执行时间)。如果您首先可以展示您是如何获得所谓的“输入”的,我们可以展示如何将其与旋转相结合。

with
     test_data ( name, rate, kind, noofitems, totalamount ) as (
                 select 'ABC', 1, 'O', 50, 50 from dual
       union all select 'ABC', 2, 'A', 10, 20 from dual
     )
-- End of test data (not part of the solution).
-- SQL query begins BELOW THIS LINE.
select name, o_rate, a_rate, o_noofitems as o_items, a_noofitems as a_items,
       o_totalamount as o_amount, a_totalamount as a_amount,
       o_noofitems + a_noofitems as totalitems,
       o_totalamount + a_totalamount as totalamount
from   test_data
pivot(
       max(rate) as rate, max(noofitems) as noofitems, max(totalamount) as totalamount
       for kind in ('O' as o, 'A' as a)
     )
;

NAME  O_RATE  A_RATE  O_ITEMS  A_ITEMS  O_AMOUNT  A_AMOUNT  TOTALITEMS  TOTALAMOUNT
----  ------  ------  -------  -------  --------  --------  ----------  -----------
ABC        1       2       50       10        50        20          60           70

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多