利用Oracle实现1行数据的多列转换(oracle 1行转多列)

利用Oracle实现1行数据的多列转换

在数据库操作中,经常会出现需要将一行数据中的多列进行转换的情况。Oracle数据库提供了多种方法来实现这种操作,如使用CASE语句、PIVOT语句等。下面将主要介绍使用CASE语句实现1行数据的多列转换。

假设有如下表结构:

CREATE TABLE student (
id NUMBER,
name VARCHAR2(50),
math_score NUMBER,
english_score NUMBER,
science_score NUMBER
);

该表中包含了每个学生的ID、姓名以及数学、英语、科学三门课的成绩。现在需要将每个学生的成绩进行转换,使得每个学生只有一行数据,其中包含每门课的名称和成绩。

使用CASE语句实现如下:

“`sql

SELECT

id,

name,

‘Math’ AS subject,

CASE

WHEN math_score >= 90 THEN ‘A’

WHEN math_score >= 80 AND math_score

WHEN math_score >= 70 AND math_score

WHEN math_score >= 60 AND math_score

ELSE ‘F’

END AS grade

FROM student

UNION ALL

SELECT

id,

name,

‘English’ AS subject,

CASE

WHEN english_score >= 90 THEN ‘A’

WHEN english_score >= 80 AND english_score

WHEN english_score >= 70 AND english_score

WHEN english_score >= 60 AND english_score

ELSE ‘F’

END AS grade

FROM student

UNION ALL

SELECT

id,

name,

‘Science’ AS subject,

CASE

WHEN science_score >= 90 THEN ‘A’

WHEN science_score >= 80 AND science_score

WHEN science_score >= 70 AND science_score

WHEN science_score >= 60 AND science_score

ELSE ‘F’

END AS grade

FROM student;


以上SQL语句使用UNION ALL将每门课的数据联合在一起,并使用CASE语句对每门课的成绩进行转换。结果如下:

ID NAME SUBJECT GRADE

1 Tom Math A

2 Jerry Math B

3 Brad Math C

4 Lisa Math D

5 John Math F

1 Tom English A

2 Jerry English C

3 Brad English B

4 Lisa English F

5 John English F

1 Tom Science A

2 Jerry Science C

3 Brad Science F

4 Lisa Science D

5 John Science F


如上所示,每个学生只有一行数据,并包含了每门课的成绩和名称。

在上述SQL语句中,可以使用一些简单的技巧来简化代码,如使用WITH语句来定义通用的成绩转换规则,然后在UNION ALL语句中重复使用该规则。

```sql
WITH grade_scheme AS (
SELECT
grade_threshold,
grade
FROM (
SELECT
90,
'A'
FROM DUAL
UNION ALL
SELECT
80,
'B'
FROM DUAL
UNION ALL
SELECT
70,
'C'
FROM DUAL
UNION ALL
SELECT
60,
'D'
FROM DUAL
UNION ALL
SELECT
0,
'F'
FROM DUAL
)
)
SELECT
id,
name,
'Math' AS subject,
(SELECT grade FROM grade_scheme WHERE math_score >= grade_threshold ORDER BY grade_threshold DESC LIMIT 1) AS grade
FROM student
UNION ALL
SELECT
id,
name,
'English' AS subject,
(SELECT grade FROM grade_scheme WHERE english_score >= grade_threshold ORDER BY grade_threshold DESC LIMIT 1) AS grade
FROM student
UNION ALL
SELECT
id,
name,
'Science' AS subject,
(SELECT grade FROM grade_scheme WHERE science_score >= grade_threshold ORDER BY grade_threshold DESC LIMIT 1) AS grade
FROM student;

上述SQL语句使用了WITH语句来定义了一个名为”grade_scheme”的子查询,该子查询定义了一些通用的成绩转换规则。在UNION ALL语句中,使用了该子查询对每门课的成绩进行转换。结果与之前相同。

总结

本篇文章介绍了使用Oracle数据库中的CASE语句实现1行数据的多列转换。同时,也提供了一些用于简化代码的技巧,如WITH语句和子查询等。在实际开发中,可以根据实际情况选择不同的技术来实现多列转换,以达到更优秀的效果。


数据运维技术 » 利用Oracle实现1行数据的多列转换(oracle 1行转多列)