Sql 将数据从多行移到一行

Sql 将数据从多行移到一行,sql,oracle,Sql,Oracle,我这里有一张类似的桌子: DOCCODE | DOCDATE | STATUS 001 | 10-OCT-13 | START 001 | 12-OCT-13 | STOP 001 | 15-OCT-13 | START 001 | 20-OCT-13 | STOP 002 | 01-NOV-13 | START 我想尝试并有这个输出 DOCCODE | STARTDATE |

我这里有一张类似的桌子:

DOCCODE  |  DOCDATE  |  STATUS    
001      | 10-OCT-13 |  START    
001      | 12-OCT-13 |  STOP    
001      | 15-OCT-13 |  START    
001      | 20-OCT-13 |  STOP    
002      | 01-NOV-13 |  START
我想尝试并有这个输出

DOCCODE   | STARTDATE  |  STOPDATE  | STATUS    
001       | 10-OCT-13  |  12-OCT-13 | STOP    
001       | 15-OCT-13  |  20-OCT-13 | STOP    
002       | 01-NOV-13  |            | START

您可以通过自(外部)连接来实现这一点

试试这个:

select sr.DOCCODE
, sr.DOCDATE [STARTDATE]
, x.DOCDATE [STOPDATE]
, ISNULL(x.[STATUS], sr.[STATUS]) [STATUS]
from my_table sr
outer apply (
    select top 1 *
    from my_table sp
    where [STATUS] = 'STOP'
    and DOCDATE > sr.DOCDATE
    and DOCCODE = sr.DOCCODE
    order by DOCDATE) x
where sr.[STATUS]  = 'START'

结果:

DOCCODE STARTDATE   STOPDATE    STATUS
001     2013-10-10  2013-10-12  STOP
001     2013-10-15  2013-10-20  STOP
002     2013-11-01  NULL        START


更新

Oracle版本(使用相关子查询而不是交叉应用):


请不要用大写字母发帖-看起来你在对我们大喊大叫。请格式化您的代码-我这次为您做。可能重复投票关闭-链接问题中的分组答案适用于任何RDBMS(不需要PIVOT或类似)。此代码是否适用于Oracle Sql developer请参阅博文中的更新谢谢您,andrey,它的工作很好欢迎您!欢迎来到stackoverflow!
DOCCODE STARTDATE   STOPDATE    STATUS
001     2013-10-10  2013-10-12  STOP
001     2013-10-15  2013-10-20  STOP
002     2013-11-01  NULL        START
select sr.DOCCODE
, sr.DOCDATE STARTDATE
, (
    select min(DOCDATE)
    from my_table sp
    where STATUS = 'STOP'
    and DOCDATE > sr.DOCDATE
    and DOCCODE = sr.DOCCODE) as STOPDATE
, NVL((
    select min(STATUS)
    from my_table sp
    where STATUS = 'STOP'
    and DOCDATE > sr.DOCDATE
    and DOCCODE = sr.DOCCODE), sr.STATUS) as STATUS
from my_table sr
where sr.STATUS  = 'START'
SELECT s1.doccode AS doccode, 
   s1.docdate AS startdate, 
   s2.docdate AS stopdate, 
   isnull(s2.status, s1.status) AS status
FROM   my_table s1
LEFT OUTER JOIN my_table s2 ON s1.doccode = s2.doccode
WHERE  s1.doccode = 'START' AND s2.doccode = 'STOP'