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'