oracle 行列转置
时间: 2023-08-19 12:13:07 浏览: 229
在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 操作来实现,示例语句如下:
SELECT *
FROM (
SELECT column_name, row_name, value
FROM table_name
)
PIVOT (
MAX(value)
FOR column_name IN ('column1', 'column2', 'column3')
);
其中,table_name 是需要进行行列转置的表名,column_name 是需要转置的列名,row_name 是需要保留的行名,value 是需要进行转置的值。在 PIVOT 操作中,使用 MAX(value) 来聚合每个行列组合的值,IN ('column1', 'column2', 'column3') 则是指定需要转置的列名。
阅读全文
相关推荐
















