Home >Database >Oracle >How to achieve row-column conversion in oracle

How to achieve row-column conversion in oracle

青灯夜游
青灯夜游Original
2022-01-25 17:23:1148486browse

Methods to implement row-column conversion: 1. Use the PIVOT() function to implement row-to-column conversion, with the syntax "SELECT * FROM (data set) PIVOT (SUM(Score) FOR coursename IN (converted column value))" "; 2. Use the unpivot() function to realize column switching.

How to achieve row-column conversion in oracle

The operating environment of this tutorial: Windows 7 system, Oracle 11g version, Dell G3 computer.

Oracle row to column

Oracle row to column is to use the value of a certain field as the only value, and then use the row value of another field Convert to its column value. Here we still use the student score table of our system as an example. The score table records (rows) correspond to the scores of each student in each subject. Then we need to make a report that displays all the subjects of each student as one column. performance information. The case data is as follows:

How to achieve row-column conversion in oracle

#So how do we achieve it? Here are several methods one by one:

1. First of all, what we must think of is that it should be possible to use Oracle grouping (group by). The implementation code is as follows:

select c.stuname,
       --利用分组聚合函数       sum(decode(b.coursename, '英语(2018上学期)', t.score, 0)) as "英语(2018上学期)",
       sum(decode(b.coursename, '数学(2018上学期)', t.score, 0)) as "英语(2018上学期)",
       sum(decode(b.coursename, '语文(2018上学期)', t.score, 0)) as "英语(2018上学期)"  from STUDENT.SCORE t, student.course b, student.stuinfo c
 where t.courseid = b.courseid
   and t.stuid = c.stuid
 group by c.stuname

We use group by to Students are grouped, and then use decode to convert the grade value of the corresponding course, and then sum it up to get the result value of the grade. The result is as follows:

How to achieve row-column conversion in oracle

2 , Oracle11g later provides the built-in function PIVOT, which can perfectly solve this row to column requirement. The specific syntax structure is as follows:

SELECT * FROM (数据查询集)PIVOT 
(
 SUM(Score/*行转列后 列的值*/) FOR 
 coursename/*需要行转列的列*/ IN (转换后列的值)
)

The specific code is as follows:

select * from  (select c.stuname,
       b.coursename,
       t.score
  from STUDENT.SCORE t, student.course b, student.stuinfo c
 where t.courseid = b.courseid
   and t.stuid = c.stuid )  /*数据源*/PIVOT 
(
 SUM(score/*行转列后 列的值*/) 
 FOR coursename/*需要行转列的列*/ IN ('英语(2018上学期)' as 英语,'数学(2018上学期)' as 数学,'语文(2018上学期)' as 语文 )
) ;

The result is as follows:

How to achieve row-column conversion in oracle

Oracle column to row conversion

Oracle column to row conversion is to convert the fields of the columns in a row according to the unique value of the row Convert to multiple rows of data. For example, the basic data of the student performance table in the Oracle row to column conversion above is that one student's subject performance corresponds to one record. Then we converted the rows into columns and turned it into a record corresponding to the scores of a student in each column (math, English, Chinese). So this article is to convert the previously converted student score table (backup table score_copy) into columns and rows again and convert it into original data. The case data is as follows:

How to achieve row-column conversion in oracle

How to achieve row-column conversion in oracle

So how do we implement column switching? Two commonly used methods are introduced below:

1. Use union all for splicing, which can perfectly convert the corresponding columns into row records. The specific code is as follows:

select t.stuname, '英语' as coursename ,t.英语 as score  from SCORE_COPY t
union all
select t.stuname, '数学' as coursename ,t.数学 as score  from SCORE_COPY t
union all
select t.stuname, '语文' as coursename ,t.语文 as score  from SCORE_COPY t

The results are as follows:

How to achieve row-column conversion in oracle

2. This problem can also be perfectly solved by using Oracle's own column-to-row function unpivot. The specific syntax structure is as follows:

select 字段 from 数据集
unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))

The implementation code is as follows:

select stuname, coursename ,score from
score_copy  t
unpivot
(score for coursename in (英语,数学,语文))

The results are as follows:

How to achieve row-column conversion in oracle

Recommended tutorial: "Oracle Tutorial"

The above is the detailed content of How to achieve row-column conversion in oracle. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn