我们的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行,适用的状态日期放在右栏中。
非常感谢任何和所有指导。
答案 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;
如果需要任何疑问/解释,请与我联系。