将两行合并到不同列中的一行

时间:2016-06-06 13:02:20

标签: sql oracle oracle-sqldeveloper

首先很抱歉,如果已经在其他地方回答了这个问题,我经过几天的搜索后仍无法找到答案。

有没有办法使用不同的列将两行合并为一行。

您将从下图中看到,该行是相同的,除了日期和位置,我要查找的是在下面的一行中有详细信息。其中日期列显示两次,具有不同的列名称,例如'日期发送到X位置'和'发送到Y位置的日期'。如果我们将正确的日期放在正确的列中,则不需要显示该位置,因为他们将从列名称中看到该位置。

enter image description here

到目前为止,我使用此查询,我不确定如何调整它来做我需要的?

select 
l.lot_number,
trunc(l.start_tran_date) AS "Date sent to location",
l.location_id_2 AS "Location"
FROM t_tran_log l 
WHERE  
(l.location_id_2 = 'SENTTOMAP' OR l.location_id_2 = 'WAITINGFORCOLLECTION')
;

这就是我希望上面的结果看起来像:

enter image description here

2 个答案:

答案 0 :(得分:1)

这将是我的方法:

1-创建测试表

    create table MESSYLOG 
(
lotn varchar(20),
datesent date,
location varchar(20)
);


insert into messylog values ('abc', '06-JUN-16', 'waiting');
insert into messylog values ('abc', '07-JUN-16', 'sent');
insert into messylog values ('def', '08-JUN-16', 'waiting');
insert into messylog values ('def', '10-JUN-16', 'sent');

--select * from MESSYLOG

2-写2个子查询

select t1.lotn,t2.DateWait, t1.DateSentmap, 
from
(
select e.lotn, e.datesent as DateSentmap
from messylog e
where e.location = 'sent'
) t1
JOIN 
 (
  select m.lotn,  m.datesent as DateWait 
from messylog m
where m.location = 'waiting'
)t2
on t1.lotn = t2.lotn

3-结果集

        LOTN  DATEWAIT  DATESENTMAP
        abc  06-JUN-16  07-JUN-16
        def  08-JUN-16  10-JUN-16

答案 1 :(得分:0)

如果某个地段的某个地点只有一个日期,可以尝试这样的事情:

SELECT lot_number
      ,MAX(CASE WHEN location_id = 'WAITINGFORCOLLECTION' THEN start_tran_date) ELSE NULL END) AS "Date waiting for collection"
      ,MAX(CASE WHEN location_id = 'SENTTOMAP'            THEN start_tran_date) ELSE NULL END) AS "Date sent to map"
  FROM t_tran_log
  GROUP BY lot_number

汇总函数(MAX)将跳过NULL列值,只留下该位置的单个值。