如何将包含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
答案 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);
此查询将构建您想要的查询。然后将结果查询作为任何其他动态选择启动。