SQL从单行获取多行

时间:2015-10-01 19:47:11

标签: sql plsql rows multiple-columns unpivot

我需要完成以下任务:

我有一个包含多列的表(c1,c2,c3,c4 ... cn)。

我想要一个以下列方式返回多行的查询(r1 r2 .. rx是原始表中的行):

r1c1 r1c2 r1c3
r1c4 r1c5 r1c6
...
r1cn-2 r1cn-1 r1cn

r2c1 r2c2 r2c3
r2c4 r2c5 r2c6
...
r2cn-2 r2cn-1 r2cn

...

rxc1 rxc2 rxc3
rxc4 rxc5 rxc6
...
rxcn-2 rxn-1 rxcn

我知道我可以使用联合并重复基本相同的查询n次,但我需要在我无法控制的基于Web的报告系统中使用该查询,并且查询对于允许的最大字符数是大的在查询中。

有什么建议吗?

谢谢!

编辑:仅供参考我在报告工具中构建报告我无法使用无法更改的数据库进行更改。因此,使用自定义函数/过程不是解决方案。它必须是PL-SQL查询。

更具体地说,我需要从原始行中有多行,假设第1行是

a b c d e f h i j

和第2行是

1 2 3 4 5 6 7 8 9

然后我会得到包含3列的下表:

a b c
d e f 
h i j
1 2 3
4 5 6
7 8 9

2 个答案:

答案 0 :(得分:0)

所以数字1,如果原始表中有一组可以被3整除的列,你就可以做多个UNION ALL。

你唯一的其他选择是枢轴或指针,两者都不会更好。

答案 1 :(得分:0)

n可以被3整除的简单情况只需使用rownumunion

WITH T1 AS
(
   SELECT rownum as rn,1 as tNum, c1 as s1,c2 as s2,c3 as s3 FROM T
   UNION ALL
   SELECT rownum as rn,2 as tNum, c4 as s1,c5 as s2,c6 as s3 FROM T
   UNION ALL
   SELECT rownum as rn,3 as tNum, c7 as s1,c8 as s2,c9 as s3 FROM T
)
SELECT s1,s2,s3 FROM T1 
ORDER BY rn,tNum

SQLFiddle demo