尝试将数据扁平化为 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 扁平化为行的快速方法