Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用于将两行数据合并为两列数据的Oracle查询_Sql_Oracle - Fatal编程技术网

Sql 用于将两行数据合并为两列数据的Oracle查询

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

我有一个查询,在一列中显示车辆进出时间,两行显示进出时间。我想在一行内显示这一点,如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((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' ));