将多行加入单行而不进行聚合 [Oracle]

Posted

技术标签:

【中文标题】将多行加入单行而不进行聚合 [Oracle]【英文标题】:Joining multiple rows into a single row without aggregation [Oracle] 【发布时间】:2020-01-21 14:30:53 【问题描述】:

我有以下疑问:

select type,
       date,
       amount
  from table;

它给出了以下结果:

TYPE    DATE        AMOUNT
--------------------------------
A       30.6.2019   15
B       30.11.2019  20
C       22.12.2019  17

我想做的是编写一个返回以下内容的查询:

TYPE1     DATE1      AMOUNT1     TYPE2    DATE2      AMOUNT2     TYPE3     DATE3      AMOUNT3
------------------------------------------------------------------------------------------------------
A         30.6.2019  15          B        30.11.2019 20          C         22.12.2019 17

第一个查询的行数始终为 3 且不超过此数。 我无法连接,因为我需要最终结果集中的多个列。 这可以在不使用 PL/SQL 的情况下在 Oracle SQL 中完成吗?

【问题讨论】:

是否有固定的行数或者需要对数百万行执行此操作? 对不起,我应该把它放到帖子里,我要编辑它。它总是 3 行 【参考方案1】:

如果你知道你有三列,枚举它们并聚合:

select max(case when seqnum = 1 then type end) as type1,
       max(case when seqnum = 1 then date end) as date1,
       max(case when seqnum = 1 then amount end) as amount1,
       max(case when seqnum = 2 then type end) as type2,
       max(case when seqnum = 2 then date end) as date2,
       max(case when seqnum = 2 then amount end) as amount2,
       max(case when seqnum = 3 then type end) as type3,
       max(case when seqnum = 3 then date end) as date3,
       max(case when seqnum = 3 then amount end) as amount3       
from (select t.*, rownum as seqnum
      from t
     ) t;

如果不知道返回的列数,则需要使用动态 SQL (execute immediate)。

【讨论】:

以上是关于将多行加入单行而不进行聚合 [Oracle]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle如何将多行转置为聚合列

四.Oracle聚合函数和内外全连接

分组函数/聚合函数/多行处理函数

Oracle数据库常用SQL函数

Oracle使用简单函数

Oracle sql subselect 查找聚合值