Sql 如何在oracle中将列表转换为矩阵?
如何将包含3列x,y,value的列表转换为包含n行和n列的矩阵?n等于countx 大概是这样的:Sql 如何在oracle中将列表转换为矩阵?,sql,oracle,pivot,Sql,Oracle,Pivot,如何将包含3列x,y,value的列表转换为包含n行和n列的矩阵?n等于countx 大概是这样的: |x | y | z| -------------- |a1 | a2| 3| |a1 | a3| 5| |a2 | a3| 9| |a3 | a3| 0| |. | . | .| |. | . | .| |a5000| a3| 1| 以下是: |x |a1 |a2 |a3 . . |a5000 -------------------
|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值。
我想你想要的是:
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);
此查询将生成所需的查询。然后将结果查询作为任何其他动态选择启动。Mmm。。。看起来是这样的:我不能使用这样的东西,因为我有太多的AttributeColumn。你是对的,但我发现oracle不能有超过1000列。