**编辑后添加了月份
在我们的(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指数作为相对年份。任何见解将不胜感激。
答案 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