如何从表中的VARRAY中提取36个值并显示为连续3年(每年12个月)

时间:2018-08-20 00:38:49

标签: sql oracle oracle11g

**编辑后添加了月份

在我们的(ORACLE 11G)数据库中,我们有一个表,该表的自定义数据类型是具有32个值(整数)的VARRAY。这些数字代表连续3年中每年每个月的值。在同一记录中,将有一个工作年度。这个工作年度将始终是VARRAY相对年份的中间年份。我正在尝试找出一种显示这些内容的方法:

当前:

| ID   | WORK_YEAR | PRODUCTION |
| 2127 |   2012    |[1..36] (<--I'm just doing 1 through 36 for simplicity's sake)

我想要的输出将是这样的:

|  ID   |  WORK_YEAR    |    MONTH   | PRODUCTION
| 2127  |     2011      |   JANUARY  |    1
| 2127  |     2011      |  FEBRUARY  |    2
| 2127  |     2011      |    MARCH   |    3
...
...
| 2127  |     2012      |   JANUARY  |   13
| 2127  |     2012      |  FEBRUARY  |   14
...
...
| 2127  |     2013      |  JANUARY   |   25
| 2127  |     2013      |  FEBRUARY  |   26
...
...
| 2127  |     2013      |  DECEMBER  |   36

我的最终目标是将其旋转,并在每个月有一个专栏,然后为每个ID(YEAR)创建一个记录;但是,我不知道如何首先将其转换为这种格式。

到目前为止,我只有:

SELECT
    WP.ID,
    WP.WORK_YEAR,
    PRO.COLUMN_VALUE AS PRODUCTION
FROM
    LINEWORK.WORK_PRODUCTION WP,
    TABLE(WP.PRODUCTION) PRO
;

但是,这不能让我将所访问的PRODUCTION指数作为相对年份。任何见解将不胜感激。

2 个答案:

答案 0 :(得分:0)

我不太了解Oracle,我在Google上搜索了有关Oracle VARRAY的一些信息,因此请尝试此>>

SELECT
    WP.ID,
    WP.WORK_YEAR,
    WP.PRODUCTION.COUNT AS maxMonth,
    PRO.X AS MonthNdx,
    (TRUNC(PRO.X / 12, 0) - 1) AS adjYear,
    WP.WORK_YEAR +  (TRUNC(PRO.X / 12, 0) - 1) AS TrueYear,
    PRO.COLUMN_VALUE AS PRODUCTION
FROM
    LINEWORK.WORK_PRODUCTION WP,
    TABLE(WP.PRODUCTION) PRO
;

修改后,删除PRO.X,使用ROW_NUMBER()>>

SELECT
    WP.ID,
    WP.WORK_YEAR,
    WP.PRODUCTION.COUNT AS maxMonth,
    ROW_NUMBER() OVER(Partition By WP.ID  Order By 1) AS ArrayNdx,
    --PRO.X AS MonthNdx,
    (TRUNC(ROW_NUMBER() OVER(Partition By WP.ID  Order By 1) / 12, 0) - 1) AS adjYear,
    WP.WORK_YEAR +  (TRUNC(ROW_NUMBER() OVER(Partition By WP.ID  Order By 1) / 12, 0) - 1) AS TrueYear,
    PRO.COLUMN_VALUE AS PRODUCTION
FROM
    LINEWORK.WORK_PRODUCTION WP,
    TABLE(WP.PRODUCTION) PRO
;

答案 1 :(得分:0)

我可以通过以下方式获得正确的结果:编写case语句,然后按如下所示旋转数据:

arg2