oracle 行列转置
时间: 2023-08-19 20:13:07 浏览: 64
在Oracle数据库中,可以使用通用SQL来实现行列转置。这种方法在MySQL和Oracle数据库中都适用,具有较好的通用性。行转列可以使用聚合函数(如sum或max)结合case when then else end语句来实现,而列转行可以使用union或union all来实现。这种方法可能稍显繁琐。另外,在Oracle数据库中,还提供了专门的函数来实现行列转置功能,如wmsys.wm_concat函数。这个函数可以将多行数据合并成一行,并使用指定的分隔符进行分隔。例如,可以使用以下语句实现行列转置:
```sql
SELECT prod_id, REPLACE(wmsys.wm_concat(amount_sold), ',', '/') AS link
FROM tab
GROUP BY prod_id
ORDER BY prod_id;
```
这个查询将按照prod_id进行分组,并将每个prod_id对应的amount_sold值使用斜杠进行分隔,最后将结果按照prod_id进行排序。这种方法在Oracle 11gR2及以上版本中可用。另外,还可以使用listagg函数来实现行列转置,这个函数在Oracle 11gR2及以上版本中可用。
相关问题
oracle 行列转换
在Oracle中,可以使用CASE WHEN语句来实现行列转换。引用\[1\]中的示例展示了如何将多行一列的数据转换为一行多列的数据。例如,可以使用以下SQL语句将学生的成绩表转换为每个学生一行的形式,每个科目作为列名,对应的成绩作为值:
SELECT NAME,
MAX(CASE WHEN COURSE='语文' THEN SCORE END) "语文",
MAX(CASE WHEN COURSE='数学' THEN SCORE END) "数学",
MAX(CASE WHEN COURSE='英语' THEN SCORE END) "英语",
MAX(CASE WHEN COURSE='物理' THEN SCORE END) "物理",
SUM(SCORE) "总分"
FROM stu
GROUP BY NAME;
同样地,引用\[2\]中的示例展示了如何将一行多列的数据转换为多行一列的数据。例如,可以使用以下SQL语句将科目和对应的成绩转换为每个学生一行的形式:
SELECT NAME,
CASE WHEN LV = 1 THEN '语文'
WHEN LV = 2 THEN '数学'
WHEN LV = 3 THEN '英语'
WHEN LV = 4 THEN '物理'
END 科目,
CASE WHEN LV = 1 THEN langu
WHEN LV = 2 THEN math
WHEN LV = 3 THEN english
WHEN LV = 4 THEN pycial
END 成绩
FROM (SELECT *
FROM course, (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 4)
)
ORDER BY 1, 2;
此外,引用\[3\]中还提供了将结果集转换为一行或多行的示例。例如,可以使用SUM或COUNT函数将每个部门的人数转换为一行:
SELECT SUM(CASE WHEN DEPTNO = 10 THEN 1 END) D_10,
SUM(CASE WHEN DEPTNO = 20 THEN 1 END) D_20,
SUM(CASE WHEN DEPTNO = 30 THEN 1 END) D_30
FROM EMP;
或者可以使用子查询和MAX函数将每个部门的人数转换为多行:
SELECT MAX(CASE WHEN DEPTNO = 10 THEN CN END) D_10,
MAX(CASE WHEN DEPTNO = 20 THEN CN END) D_20,
MAX(CASE WHEN DEPTNO = 30 THEN CN END) D_30
FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);
这些是在Oracle中进行行列转换的一些常见方法。希望对你有所帮助!
#### 引用[.reference_title]
- *1* *2* *3* [Oracle中行列互转](https://blog.csdn.net/xiaochenXIHUA/article/details/120409641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
oracle 行列转换函数
Oracle提供了几种行列转换的函数,包括pivot、unpivot和decode。其中,pivot函数用于将行数据转换为列,unpivot函数用于将列数据转换为行,而decode函数是Oracle内置的条件函数,可用于在查询结果中进行值的转换。
使用pivot函数进行行列转换的语法如下:
```
SELECT *
FROM (SELECT *
FROM table_name
PIVOT (aggregate_function(column_name)
FOR pivot_column_name IN (list_of_values))
);
```
使用unpivot函数进行列行转换的语法如下:
```
SELECT *
FROM (SELECT *
FROM table_name
UNPIVOT (new_column_name FOR aggregate_column_name IN (list_of_columns))
);
```
对于decode函数的使用,例如:
```
SELECT column_name,
decode(column_name, value1, result1, value2, result2, default_result)
FROM table_name;
```