暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL查询将十行一列转换为五行一列

askTom 2018-10-04
315

问题描述

我有一个以列名为值的表。表格中有10行。此输出的所需输出将显示为两列,前5行为一列A,第6至10行为一列B,彼此相邻为5行数据,如下所示
A  B
------------------------
ABN001001   ABN001006
ABN001002   ABN001007
ABN001003   ABN001008
ABN001004   ABN001009
ABN001005   ABN001010
复制


数据脚本

create table Test1
(id number, value varchar(40));

begin
insert into Test1 (id,value) values (1000,'ABN001001');
insert into Test1 (id,value) values (1002,'ABN001002');
insert into Test1 (id,value) values (1003,'ABN001003');
insert into Test1 (id,value) values (1004,'ABN001004');
insert into Test1 (id,value) values (1005,'ABN001005');
insert into Test1 (id,value) values (1006,'ABN001006');
insert into Test1 (id,value) values (1007,'ABN001007');
insert into Test1 (id,value) values (1008,'ABN001008');
insert into Test1 (id,value) values (1009,'ABN001009');
insert into Test1 (id,value) values (1010,'ABN001010');
end;
复制


谢谢
拉维


专家解答

这是一种方法:

-为每一行分配一个行号
-通过将该数字除以5,将行分成1-5、6-10组。占据它的天花板
-同时获取此行号mod 5的值

然后,您可以按第一个计算中的值进行透视。这将它们分成两列。你需要两个mod将组分成五行。这是因为数据库为不在pivot子句中的每一列添加一个隐式组by

这给出了:

with rws as (
  select ceil ( row_number () over ( order by id ) / 5 ) grp,
         mod ( row_number () over ( order by id ), 5  ) rw,
         value
  from   test1 t
)
  select * 
  from   rws 
  pivot (
    max ( value ) for grp in ( 1 a, 2 b)
  )
  order by a;

RW   A           B           
   1 ABN001001   ABN001006   
   2 ABN001002   ABN001007   
   3 ABN001003   ABN001008   
   4 ABN001004   ABN001009   
   0 ABN001005   ABN001010
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论