【问题标题】:Format data from a table into another formatted table using Oracle SQL使用 Oracle SQL 将表中的数据格式化为另一个格式化的表
【发布时间】:2022-01-15 20:09:45
【问题描述】:

所以我有 1 个包含 3 列的数据表,1 个是参考编号,另一个是该参考的版本,第三个是属于该参考的项目。

我想要做的是显示一个显示 3 列的表格,第一列是参考编号,下一个是版本 1 上的项目列表和“最后一个最终版本”上的项目列表。

原始数据:

refno version item
1 1 ABC123
1 1 XYZ123
1 2 EFG123
2 1 UIO123
2 1 JKL123
3 1 ABC123
3 2 ABC123
3 2 HJF123
3 2 IKJ123
3 2 EEK123
3 2 EEK123
4 1 GFD123
4 1 YUI123
4 2 YUI123
5 1 TYP123
6 1 GHS123
7 1 TEP123
7 1 SLS123
7 2 TEP123
7 2 SLS123
7 2 AEE123
7 3 AAL123
7 4 QEF123

我希望如何格式化:

refno Original Item Final Item
1 ABC123 EFG123
1 XYZ123
2 UIO123 UIO123
2 JKL123 JKL123
3 ABC123 ABC123
3 HJF123
3 IKJ123
3 EEK123
3 EEK123
4 GFD123 YUI123
4 YUI123
5 TYP123 TYP123
6 GHS123 GHS123
7 TEP123 QEF123
7 SLS123

关于如何在 SQL(特别是 oracle SQL)中执行此操作的任何提示

【问题讨论】:

  • 我们以 refno=1 为例。您是如何决定将 ABC123 与 EFG123 显示在同一行,而 XYZ123 应与 null 一起出现在最后一列的?为什么不将 XYZ123 与 EFG123 和 ABC123 与null 配对?
  • 不确定这是否重要。关键是第二列应该有最新版本的项目,不管它放在哪里。
  • “不确定”是什么意思?是你的问题,你不知道要求是什么?您是说输出中的行中原始项目和最终项目的“配对”可以是我们想要的任何东西 - 特定的初始项目和相应的特定最终项目出现在同一行的事实在您的现实生活中的问题?
  • 没有配对发生,我想要一个列表在同一个表中,第 2 列只是第一个版本的项目列表,第 3 列只是最后一个版本的项目列表对于那个参考号。唯一连接第一个和最后一个版本的是 refno,而不是项目。

标签: sql oracle


【解决方案1】:

看起来你想要完全自我加入

select coalesce(a.refno, b.refno) refno, a.item OriginalItem, b.item FinalItem
from(
   select * 
   from t 
   where version = 1
) a
full join(
  select * 
  from (
     select *, rank() over(partition by refno order by version DESC) rn 
     from t 
     where version > 1
  ) t
  where rn=1
) b
on a.refno=b.refno 
order by coalesce(a.refno, b.refno), a.item, b.item

返回

refno   OriginalItem    FinalItem
1   ABC123  EFG123
1   XYZ123  EFG123
2   JKL123  
2   UIO123  
3   ABC123  ABC123
3   ABC123  EEK123
3   ABC123  EEK123
3   ABC123  HJF123
3   ABC123  IKJ123
4   GFD123  YUI123
4   YUI123  YUI123
5   TYP123  
6   GHS123  
7   SLS123  QEF123
7   TEP123  QEF123

【讨论】:

  • 感谢您的建议,不完全在那里,所以如果没有进一步的版本,最后的最终版本也可能是版本 1,因此第二列需要显示版本 1 中的项目,在瞬间这些会是空白的吗?此外,我为每一行获得相同的值,例如,如果 v1 上有 2 个项目但 v2 上只有 1 个项目,我只需要显示其中 1 个值并将下一行设为空白(不显示项目两次。
  • 那么两个 3 NULL EEK123 3 NULL EEK123 中的第二个将是 3 NULL NULL 。真的是你想要的吗?我的意思是您想要的布局取决于结果行排序。当查询返回事实时,这应该在客户端更好地处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多