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

How can convert a list to matrix in oracle?

如何将包含 3 列("x"、"y"、"value")的列表转换为具有 n 行 n 列的矩阵?(n 等于计数(distinct 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

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

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);

此查询将构建您想要的查询。然后像任何其他动态 select.

一样启动生成的查询