尝试将数据扁平化为 oracle 中的列

Posted

技术标签:

【中文标题】尝试将数据扁平化为 oracle 中的列【英文标题】:Trying to flatten data into columns within oracle 【发布时间】:2019-08-05 18:42:03 【问题描述】:

我在 Oracle 12 中有一个表,我需要将表展平,以便 edit_number 的所有行都汇总为一行,其中包含多列。我以前见过这种情况,但我正在努力寻找一种将它们放在特定列中的方法。每个 Edit_Number 在 Edit_Raw_Table 中最多有 4 行

Edit_Raw_Table

+----------+-------------+---------+------------+------------+
| table_ID | Edit_Number | Edit_Ref| Edit_Text  | Edit_Valid |
+----------+-------------+---------+------------+------------+
|        1 |        3    |   10146 | REASON 123 |   YES      |
|        2 |        3    |   10169 | REASON 567 |   YES      |
|        3 |        3    |   10156 | REASON 456 |    NO      |
+----------+-------------+---------+------------+------------+

我想做的是这样的:

+------------+-----------+------------+------------+-------------+
| Edit_Number| Edit_Ref_1| Edit_Text_1| Edit_Ref_2 | Edit_Text_2 | 
+------------+-----------+------------+------------+-------------+
|       3    |   10146   | Reason 123 |    10169   |  Reason 567 |
+------------+-----------+------------+------------+-------------+

【问题讨论】:

对,看起来它可以在 t-sql 中工作,但不能在 PL/SQL 中工作。我不确定是否应该包含我尝试过的内容。 我已经删除了代码,因为它与最终目标无关。 【参考方案1】:

decode(或case,随你喜欢;在这种情况下,decode 非常简单)一起进行一点聚合可能会完成这项工作。

SQL> with edit_raw_table (table_id, edit_number, edit_ref, edit_text, edit_valid) as
  2    (select 1, 3, 10146, 'Reason 123', 'yes' from dual union all
  3     select 2, 3, 10169, 'Reason 567', 'yes' from dual union all
  4     select 3, 3, 10156, 'Reason 456', 'no'  from dual union all
  5     --
  6     select 4, 8, 10111, 'reason 111', 'yes' from dual union all
  7     --
  8     select 5, 4, 20222, 'reason 222', 'no'  from dual union all
  9     select 6, 4, 20333, 'reason 333', 'yes' from dual union all
 10     select 7, 4, 20444, 'reason 444', 'yes' from dual union all
 11     select 8, 4, 20555, 'reason 555', 'yes' from dual
 12    ),
 13  temp as
 14    (select e.*,
 15            row_number() over (partition by edit_number order by table_id) rn
 16     from edit_raw_table e
 17     where edit_valid = 'yes'
 18    )
 19  select edit_number,
 20         max(decode(rn, 1, edit_ref)) edit_ref_1,
 21         max(decode(rn, 1, edit_text)) edit_text_1,
 22         --
 23         max(decode(rn, 2, edit_ref)) edit_ref_2,
 24         max(decode(rn, 2, edit_Text)) edit_text_2,
 25         --
 26         max(decode(rn, 3, edit_ref)) edit_ref_3,
 27         max(decode(rn, 3, edit_Text)) edit_text_3,
 28         --
 29         max(decode(rn, 4, edit_ref)) edit_ref_4,
 30         max(decode(rn, 4, edit_Text)) edit_text_4
 31  from temp
 32  group by edit_number
 33  order by edit_number;

EDIT_NUMBER EDIT_REF_1 EDIT_TEXT_ EDIT_REF_2 EDIT_TEXT_ EDIT_REF_3 EDIT_TEXT_ EDIT_REF_4 EDIT_TEXT_
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
          3      10146 Reason 123      10169 Reason 567
          4      20333 reason 333      20444 reason 444      20555 reason 555
          8      10111 reason 111

SQL>

【讨论】:

这行得通,当然用当前表中的选择替换选定的值。谢谢!

以上是关于尝试将数据扁平化为 oracle 中的列的主要内容,如果未能解决你的问题,请参考以下文章

试图将行扁平化为列

IOS将UIVIew中的UIImageView扁平化为单个UIView [重复]

Python pandas:通过代理键将 JSON 扁平化为行的快速方法

如何更有效地将嵌套列表扁平化为一个列表而不是使用 unlist 方法?

扁平化列表列表,用特定值替换空子列表

如何在一维数组中“扁平化”或“索引” 3D数组?