将 Oracle 表中的多行数据按照指定规则转换为一行数据,可以使用 Oracle 的 PIVOT 和 UNPIVOT 操作。下面是一个简单的示例,将表中的多行数据按照 ID 进行行转列拼接:
```sql
-- 创建测试表
CREATE TABLE test_table (
id NUMBER,
key VARCHAR2(10),
value VARCHAR2(10)
);
-- 插入测试数据
INSERT INTO test_table VALUES (1, 'A', 'a1');
INSERT INTO test_table VALUES (1, 'B', 'b1');
INSERT INTO test_table VALUES (1, 'C', 'c1');
INSERT INTO test_table VALUES (2, 'A', 'a2');
INSERT INTO test_table VALUES (2, 'B', 'b2');
INSERT INTO test_table VALUES (2, 'C', 'c2');
-- 行转列拼接
SELECT * FROM (
SELECT id, key, value FROM test_table
)
PIVOT (
MAX(value) FOR key IN ('A', 'B', 'C')
)
ORDER BY id;
```
以上代码中,首先创建了一个测试表 test_table,并插入了多行数据。然后使用 PIVOT 操作将表中的多行数据按照 ID 进行行转列拼接,其中 MAX(value) 表示对于相同的 ID 和 key,取 value 的最大值(因为在这里只有一个值,所以实际上是取原始值)。最后按照 ID 排序输出结果。
如果需要将转换后的数据拼接成一行,可以使用 Oracle 的 LISTAGG 函数。以下是一个示例:
```sql
-- 行转列拼接并拼接成一行
SELECT id, LISTAGG(a, ',') WITHIN GROUP (ORDER BY id) AS a,
LISTAGG(b, ',') WITHIN GROUP (ORDER BY id) AS b,
LISTAGG(c, ',') WITHIN GROUP (ORDER BY id) AS c
FROM (
SELECT id, key, value FROM test_table
)
PIVOT (
MAX(value) FOR key IN ('A' AS a, 'B' AS b, 'C' AS c)
)
GROUP BY id;
```
以上代码中,使用 PIVOT 将表中的多行数据按照 ID 进行行转列拼接,并使用 AS 子句将列名重命名为 a、b、c。然后使用 LISTAGG 函数将转换后的数据拼接成一行。最后按照 ID 分组输出结果。