Oracle запрос для объединения двух строк данных в два столбца данных - PullRequest
0 голосов
/ 16 октября 2019

У меня есть запрос, который показывает время входа и выхода автомобиля в один столбец с двумя строками времени входа и выхода. Я хотел показать это в один ряд как вовремя, так и вне времени. Вот мой запрос

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

, чтобы две строки были объединены в одну строкус двумя разными столбцами In и Out

1 Ответ

0 голосов
/ 19 октября 2019

Только мой подход, мысль может быть полезной. «Оператор PIVOT собирает данные в отдельные строки, объединяет их и преобразует в столбцы». https://oracle -base.com / Articles / 11g / Операторы поворота и разворота-11gr1

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' ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...