ORACLE:动态数据的 PIVOT 表

Posted

技术标签:

【中文标题】ORACLE:动态数据的 PIVOT 表【英文标题】:ORACLE: PIVOT table for Dynamic data 【发布时间】:2020-05-28 03:21:38 【问题描述】:

我有一张桌子 select * from xx_test

我需要一个查询来获得如下输出

我尝试了以下查询

SELECT
    PROJECT,
    TASK,
    PROJ_NAME,
    MAX(CASE WHEN PERIOD = 'DEC-16' THEN cost END) AS DEC_16,
    MAX(CASE WHEN PERIOD = 'JAN-17' THEN cost END) AS JAN_17    
FROM    xx_test
GROUP BY PROJECT,
    TASK,
    PROJ_NAME 

它似乎给出了所需的输出,但不幸的是,表格数据将根据我的报告参数中给出的时间段进行填充(即,DEC-16、JAN-17 不会一直相同)。

还有其他方法可以实现吗?

【问题讨论】:

你会一直传递两个参数吗?或者可以更多?我只是想知道您想要进入所需结果的列数将始终为 5? @Tejash 期间是报告中的 from/to 参数。如果我通过 Dec-16(as from) 和 Mar-17(as To) 参数,则 period 列将具有 DEC-16、JAN-17、FEB-17 和 Mar-17。所以答案是否定的,我不会在结果中总是有 5 列。列数将是动态的,取决于 PERIOD FROM/PERIOD TO 值。 那么你必须使用动态查询,因为oracle SQL查询不允许动态列数。 我不擅长写动态查询,请问你能帮我吗? 【参考方案1】:

我们在数据库中没有原生的动态枢轴,但是来自 AMIS 的 Anton 使用 PLSQL 实用程序提供了它。

https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/

【讨论】:

以上是关于ORACLE:动态数据的 PIVOT 表的主要内容,如果未能解决你的问题,请参考以下文章

【求助】有关oracle 动态行转列

SQL Server - 动态数据透视表 - SQL 注入

SQL Server 动态 Pivot 为每个类别返回一行

使用动态Pivot时的总(SUM)行

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表

动态改变 Pivot 控件中枢轴项的设计