在(Oracle)中将(N)列的多(M)行转换为具有(M * N)列的一行

时间:2011-03-10 00:01:31

标签: oracle

我在查找关于此的示例或信息时遇到了很多麻烦。我调查了PIVOT,但我发现的例子让我对实际发生的事情感到有些困惑。我也不打算对数据进行求和或分组。

基本上,我有一个返回2行4列的查询

A B C D
--------
1 2 4 8
2 4 8 0

我希望看起来像

A B C D A2 B2 C2 D2
-------------------
1 2 3 4  2  4  8  0

这是我能在没有PL / SQL的情况下完成的事情吗?

编辑:如果有一种方法可以为固定数量的行和列执行此操作 - 我仍然欢迎这种方法的答案。理想情况下,它也适用于SQL Server,但我对Oracle特定的解决方案感到满意。

3 个答案:

答案 0 :(得分:2)

我从未见过根据返回的行数改变结果集中列数的机制。您可以根据结果集动态生成查询,然后执行查询。

PIVOT表更多的是关于切换X和Y坐标。我认为这不是你想要的。

鉴于你有一个固定的最大值,你总是可以返回6 * N列并使用rownum上的decode来选择合适的列中的数据。

答案 1 :(得分:2)

既然你已经提到即使是行数和列数固定的解决方案也没关系,你可以尝试一下......

SELECT MIN(DECODE(rownum, 1, A, null)) A,
       MIN(DECODE(rownum, 1, B, null)) B,
       MIN(DECODE(rownum, 1, C, null)) C,
       MIN(DECODE(rownum, 1, D, null)) D,
       MIN(DECODE(rownum, 2, A, null)) A2,
       MIN(DECODE(rownum, 2, B, null)) B2,
       MIN(DECODE(rownum, 2, C, null)) C2,
       MIN(DECODE(rownum, 2, D, null)) D2
FROM <test_table>

答案 2 :(得分:1)

select语句总是需要在分析时确定可固定的列数。你要问的是能够在获取时确定列。

无法完成。