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

Merging two rows on to one in different columns

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

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

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

到目前为止,我一直在使用这个查询,但我不确定如何调整它来满足我的需要?

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')
;

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

如果给定地段的某个位置只有一个日期,可以尝试这样的操作:

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 列值,为位置保留单个值。

这将是我的方法:

1- 创建测试 table

    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