将两行合并到不同列中的一行
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
首先很抱歉,如果这个问题已经在其他地方得到了回答,尽管经过几天的搜索,我仍然无法找到答案。
有没有办法使用不同的列将两行合并为一行。
您将从下图中看到,除了日期和地点之外,该行是相同的,我要查找的是将下面的详细信息放在一行中。其中日期列以不同的列名称显示两次,例如 '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