如何在oracle中将列表转换为矩阵?

时间:2015-07-07 08:46:23

标签: sql oracle pivot

如何将包含3列(“x”,“y”,“value”)的列表转换为包含n行和n列的矩阵?(n等于count(不同x))

类似的东西:

|x    | y | z|
--------------
|a1   | a2| 3|
|a1   | a3| 5|
|a2   | a3| 9|
|a3   | a3| 0|
|.    | . | .|
|.    | . | .|
|a5000| a3| 1|

到下面:

|x     |a1     |a2    |a3 . .   |a5000
---------------------------------------
|a1    |null   |3     |5   ..   |null
|a2    |null   |null  |9   ..   |null
|a3    |null   |null  |0   ..   |null
|.     | .     | .    |    ..   |.
|.     | .     | .    |    ..   |.
|a5000 |null   |null  |1   ..   |null
  • 我无法使用pivot,因为我无法在查询中写入所有y值。

1 个答案:

答案 0 :(得分:0)

我假设你想要这样的东西:

SELECT * 
  FROM (SELECT * FROM YOUR_TABLE) 
  PIVOT (MAX(Z) 
         FOR Y IN ('A1','A2','A3'..., 'A5000')) 
  ORDER BY TO_NUMBER(SUBSTR(X,2));

正如您所提到的,您无法编写查询,因为有太多的' A'值。

但您可以编写一个编写查询的查询:

SELECT 'SELECT * FROM (SELECT * FROM YOUR_TABLE) PIVOT (MAX(Z) FOR Y IN ('
    || LISTAGG('''A'||(LEVEL)||'''', ',') WITHIN GROUP (ORDER BY LEVEL) 
    || ')) ORDER BY TO_NUMBER(SUBSTR(X,2))'
  FROM DUAL 
  CONNECT BY LEVEL <= (SELECT COUNT(DISTINCT X) FROM YOUR_TABLE);

此查询将构建您想要的查询。然后将结果查询作为任何其他动态选择启动。