Sql 用于将两行数据合并为两列数据的Oracle查询
我有一个查询,在一列中显示车辆进出时间,两行显示进出时间。我想在一行内显示这一点,如in time和out time。这是我的问题Sql 用于将两行数据合并为两列数据的Oracle查询,sql,oracle,Sql,Oracle,我有一个查询,在一列中显示车辆进出时间,两行显示进出时间。我想在一行内显示这一点,如in time和out time。这是我的问题 SELECT RowNum as sr, agent_name, agency_name, TO_CHAR(ISSUEDATETIME, 'dd-mm-yyyy HH12:MI:SS PM') as issueddatetime, action, TIME, gate, passnumber, cardnumber, vehicletype, (ROUND((MA
SELECT
RowNum as sr,
agent_name,
agency_name,
TO_CHAR(ISSUEDATETIME, 'dd-mm-yyyy HH12:MI:SS PM') as issueddatetime,
action,
TIME,
gate,
passnumber,
cardnumber,
vehicletype,
(ROUND((MAX_TIME - MIN_TIME)*24, 2)) AS DURATION
FROM
(
SELECT T.*,
CASE
WHEN T.ACTION = 'IN' THEN ROW_NUMBER() OVER(
PARTITION BY AGENT_ID, TRUNC(TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM'))
ORDER BY
TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM')
)
END AS IN_TIME_RN,
CASE
WHEN T.ACTION = 'OUT' THEN ROW_NUMBER() OVER(
PARTITION BY AGENT_ID, TRUNC(TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM'))
ORDER BY TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM')
DESC
)
END AS OUT_TIME_RN,
MIN(CASE
WHEN T.ACTION = 'IN' THEN TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM')
END) OVER(
PARTITION BY AGENT_ID, TRUNC(TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM'))
) AS MIN_TIME,
MAX(CASE
WHEN T.ACTION = 'OUT' THEN TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM')
END) OVER(
PARTITION BY AGENT_ID, TRUNC(TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM'))
) AS MAX_TIME
FROM
(
SELECT
eofficeuat.entrylog_vehicle.agent_id,
eofficeuat.cnf_agents.agent_name,
eofficeuat.gatepass.agency_name,
eofficeuat.gatepass.agency_id,
TO_CHAR(eofficeuat.entrylog_vehicle.scantime, 'dd-mm-yyyy HH12:MI:SS PM') as Time,
eofficeuat.entrylog_vehicle.action,
eofficeuat.gatelist.shortname as gate,
eofficeuat.entrylog_vehicle.passnumber,
eofficeuat.entrylog_vehicle.cardnumber,
eofficeuat.gatepass.vehicletype,
eofficeuat.gatepass.ISSUEDATETIME
FROM
eofficeuat.entrylog_vehicle
INNER JOIN eofficeuat.cnf_agents ON eofficeuat.entrylog_vehicle.agent_id = eofficeuat.cnf_agents.agent_id
INNER JOIN eofficeuat.gatelist ON eofficeuat.entrylog_vehicle.gate_id = eofficeuat.gatelist.id
INNER JOIN eofficeuat.gatepass ON eofficeuat.entrylog_vehicle.passnumber = eofficeuat.gatepass.id
WHERE
eofficeuat.entrylog_vehicle.scantime between TO_DATE ('08/10/2019', 'dd/mm/yyyy') and TO_DATE ('15/10/2019', 'dd/mm/yyyy')
ORDER BY Time asc
)T
)
WHERE
TO_DATE(TIME, 'dd-mm-yyyy hh12:mi:ss PM') IN (
MIN_TIME,
MAX_TIME
)
and
(ROUND((MAX_TIME - MIN_TIME)*24, 2)) is not null
and
(ROUND((MAX_TIME - MIN_TIME)*24, 2)) > 0
下面是这个问题的答案
Agency_name Action Time
=========== ======= ===========================
Luna Corporation In 09-10-2019 04:03:06 PM
Luna Corporation Out 09-10-2019 04:32:49 PM
但我想要这样
Agency_name In Out
=========== ======= ======
Luna Corporation 09-10-2019 04:03:06 PM 09-10-2019 04:03:06 PM
因此,将两行合并为一行,并使用两个不同的列输入和输出我认为这是一种有用的方法。“PIVOT操作符以单独的行获取数据,聚合数据并将其转换为列”。
你能给我们展示一些示例表数据和预期结果吗?都是格式化文本,而不是图像。(开始之前先看一看。)需要样本数据、期望的结果和对逻辑的解释。如果您的要求是在假设所有其他列数据相同的情况下将两行合并为一行,那么我的方法是使用值分组,并将IN | | OUT作为一列进行嵌套查询。只是想一想。您的查询选择了许多列,但指定的结果只有3列。要么调整查询,要么调整其结果-以匹配!yes将在一行中显示列,我只提到了一些列
with
vechile_log as
( select 'Luna Corporation' as Agency_name, 'IN' as action,
to_date('09-10-2019 16:03:06','dd-mm-yyyy hh24:mi:ss')as Tme from dual
UNION
select 'Luna Corporation' as Agency_name, 'OUT' as action,
to_date('09-10-2019 16:32:49','dd-mm-yyyy hh24:mi:ss') as Tme from dual)
select * from (
select AGENCY_NAME, --add extra columns here
tme, action from vechile_log)
pivot(max(tme) for action in ('IN' , 'OUT' ));