在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
- 我无法使用数据透视表,因为我无法在查询中写入所有 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);
此查询将构建您想要的查询。然后像任何其他动态 select.
一样启动生成的查询
如何将包含 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
- 我无法使用数据透视表,因为我无法在查询中写入所有 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);
此查询将构建您想要的查询。然后像任何其他动态 select.
一样启动生成的查询