对于以下场景,如何在 oracle sql 中执行类似 unpivot 的操作?

Posted

技术标签:

【中文标题】对于以下场景,如何在 oracle sql 中执行类似 unpivot 的操作?【英文标题】:How to do something like unpivot like in oracle sql for the following scenario? 【发布时间】:2020-10-05 14:56:29 【问题描述】:

这是表格语句,我想将数据转换为非透视数据,比如只使用 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】:

无需数据透视/取消透视即可以您想要的格式显示数据。只要每天只有1个PRO_DATE,就可以使用LEADLAG解析函数。

查询

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');

【讨论】:

以上是关于对于以下场景,如何在 oracle sql 中执行类似 unpivot 的操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sqlcmd在批处理脚本中执行SQL?

在Oracle中启用AutoTrace查看SQL执行计划

如何在jdbc中执行oracle程序

如何在 Oracle SQL Developer 中多次执行相同的存储过程?

oracle中如何执行包含动态SQL的存储过程?

如何在 java 中使用 jdbc 为 oracle 10g 执行 log miner PL/SQL 查询