2013-08-07 35 views
0

对于我的一个ETL作业,我需要一个将行转换为列的SQL查询。困难的是,我要参数多少行得到转换成一列如以下的例子:将行转换为ORACLE中的列使用参数化的SQL

ATM我的情况是这样的:

的Oracle 11g

一栏表:

参数

AB

AE

CF

GH

5G

H3

7P

... ..

SQL查询:

SELECT listagg ('''' 
    ||PARAMETER 
    ||'''', ',') WITHIN GROUP (
ORDER BY ROWNUMBER) AS PARAMETER, 
FROM 
    (SELECT 
    CASE 
     WHEN ROWNUM <= 5 THEN 5 
     WHEN ROWNUM <= 10 THEN 10 
     WHEN ROWNUM <= 15 THEN 15 
     WHEN ROWNUM <= 20 THEN 20 
     WHEN ROWNUM <= 25 THEN 25 
    END AS ROWNUMBER 
    PARAMETER 
    FROM SR0_CRTL_SL_OL_PSM_PARAMETER 
) 
GROUP BY ROWNUMBER 

结果是这样的:

参数

AB,BG,RT,ZH,JK

AE,HL,GH,DZ,KL

CF,GH ,NM,SD,WE ... ..

我想要的是一个Query tak一个数字,例如。 5 以下结果:

PARAMETER

AB,BG,RT,ZH,JK

AE,HL,GH,DZ,KL

CF,GH, NM,SD,我们 ... ..

或者需要如。 8,其结果将是这样的:

PARAMETER

AB,BG,RT,ZH,JK,AE,HL,GH

DZ,KL,CF,GH,NM, SD,WE,DE

FG,JK,KL,UZ,IT,FG,HR,TZ ......

我希望你明白我的意思。也许有人可以给我一些帮助。

感谢

PS:我知道,我的英语是该死的好“:}

回答

1

您可以使用算术计算组 - 做一个划分,并从中取整数。下面以“8”作为参数:

SELECT listagg (''''||PARAMETER||'''', ',') WITHIN GROUP (ORDER BY RowNumber) AS PARAMETER, 
FROM (SELECT trunc((rownum - 1)/8) as grp, t.*, 
      rownum as RowNumber 
     FROM SR0_CRTL_SL_OL_PSM_PARAMETER t 
    ) t 
GROUP BY grp; 
+0

这就是我一直在寻找。愚蠢的是我没有提出这样的解决方案。猜猜我还没有学到很多东西。非常感谢! –