Как сделать что-то вроде unpivot, как в oracle sql, для следующего сценария?

#sql #oracle #unpivot

#sql #Oracle #unpivot

Вопрос:

Это операторы таблицы, я хочу преобразовать данные во что-то непривычное, например, используя только sql.

 create table galy(
pro_Date date,
profit number
);
insert into galy values(sysdate-1,30);
insert into galy values(sysdate,20);
insert into galy values(sysdate 1,40);
insert into galy values(sysdate 2,50);
insert into galy values(sysdate 3,70);
commit;
  

Вывод, необходимый в одном запросе (даты, имеющие сб и воскресенье, не должны учитываться)

       Date                  d-1                    d                d 1
    01-02-2018(sysdate)      30                    20                40
     ....
     ....
  

Ответ №1:

Для отображения данных в нужном формате pivot / unpivot не требуется. Пока есть только 1 PRO_DATE в день, вы можете использовать LEAD LAG аналитические функции and .

Запрос

 SELECT pro_date,
       LAG (profit) OVER (ORDER BY pro_date)     AS prior_day_profit,
       profit                                    AS current_day_profit,
       LEAD (profit) OVER (ORDER BY pro_date)     AS next_day_profit
  FROM galy;
  

Результат

     PRO_DATE    PRIOR_DAY_PROFIT    CURRENT_DAY_PROFIT    NEXT_DAY_PROFIT
____________ ___________________ _____________________ __________________
04-OCT-20                                           30                 20
05-OCT-20                     30                    20                 40
06-OCT-20                     20                    40                 50
07-OCT-20                     40                    50                 70
08-OCT-20                     50                    70
  

Обновить

Чтобы исключить выходные, вы можете просто добавить предложение where в свой запрос

 SELECT pro_date,
       LAG (profit) OVER (ORDER BY pro_date)      AS prior_day_profit,
       profit                                     AS current_day_profit,
       LEAD (profit) OVER (ORDER BY pro_date)     AS next_day_profit
  FROM galy
 WHERE TO_CHAR (pro_date, 'DY') NOT IN ('SAT', 'SUN');