SQL Query将行值拆分为仅包含一条记录的单独列

时间:2018-01-29 04:57:50

标签: sql oracle oracle11g

我们的Oracle 11g数据库有一个跟踪文档更改的表,类似于以下内容:

ID  |     DATE     | STATUS_ID
203 |  10-02-2017  |   2
203 |  10-04-2017  |   3
168 |  08-15-2017  |   2
203 |  11-01-2017  |   4

我想了解如何根据上表的日期/ status_id制作包含记录的2个新列。以上数据将转换为以下数据(状态2 =开放,状态4 =已关闭;我不需要任何其他状态):

ID  |   OPEN_DATE  |   CLOSED_DATE
203 |  10-02-2017  |  11-01-2017
168 |  08-15-2017  |    NULL

我认为这类似于Excel或Access中的数据透视表或交叉表查询,但我不确定如何处理此问题。我想确保每个文档ID只有1行,适用的状态日期放在右栏中。

非常感谢任何和所有指导。

3 个答案:

答案 0 :(得分:1)

有一个简单的选项可以避免连接成本,条件聚合......

SELECT
  ID, 
  MIN(CASE WHEN status = 2 THEN date END)  AS DATE_OPEN, 
  MAX(CASE WHEN status = 4 THEN date END)  AS DATE_CLOSED
FROM
  yourTable
WHERE
  status IN (2, 4)
GROUP BY
  ID

答案 1 :(得分:0)

试试这个。

select t1.id, t1.date AS 'fromdate', t2.date AS 'todate'
from 
    (SELECT id,date FROM `newtracker` WHERE status= 2) t1
left join
    (SELECT id,date FROM `newtracker` WHERE status = 4) t2
on
    t1.id = t2.id

答案 2 :(得分:0)

试试这个:

select a.*,b.end_date
from
(select id,date as start_date
from test
where  status_id = 2 ) a
left join
(select id,date as end_date
from test
where  status_id = 4 ) b
on a.id = b.id;

如果需要任何疑问/解释,请与我联系。