[英]How to transpose columns to rows and get the max and min value in Oracle
输入
学生姓名 | 数学 | 科学 | 社会的 |
---|---|---|---|
一种 | 20 | 30 | 10 |
乙 | 10 | 20 | 30 |
Output
学生姓名 | 最大子 | 最小子 |
---|---|---|
一种 | 科学 | 社会的 |
乙 | 社会的 | 20数学 |
我试过了
select student_name,max(marks) m1, min(marks) m2
from
(
select student_name, engg, fre, sp from student)
unpivot (marks for subject in(engg, fre, sp)
)
group by student_name;
但没有运气
取消透视,然后重新透视(或者,更简单,只是显式聚合,如下所示):
with
student(student_name, math, science, social) as (
select 'A', 20, 30, 10 from dual union all
select 'B', 10, 20, 30 from dual
)
select student_name,
max(sub) keep (dense_rank last order by mark nulls first) as max_sub,
min(sub) keep (dense_rank first order by mark nulls last ) as min_sub
from student
unpivot (mark for sub in (math as 'Math', science as 'Science',
social as 'Social'))
group by student_name
;
STUDENT_NAME MAX_SUB MIN_SUB
------------ ------- -------
A Science Social
B Social Math
您的问题说明中有一些缺失或明显错误。 首先也是最重要的,我希望在现实生活中你有一个学生 ID 列——不同的学生可能有相同的名字。 (可以解决这个特定问题,但不是一般情况。)
然后 - 您需要指定应如何处理null
成绩(例如,如果学生根本没有数学成绩怎么办),以及在平局的情况下要显示什么(学生在数学方面具有相同的最高成绩)两个不同的科目)。 我在上面做了一组特定的选择——它们可能适合也可能不适合您的用例。 任何其他选择都可以很容易地适应,只要你说出它们是什么。
您不需要UNPIVOT
然后PIVOT
。 您可以使用CASE
语句并使用GREATEST
比较列值(最大值)和LEAST
(最小值):
SELECT student_name,
CASE
WHEN maths = LEAST(maths, science, social) THEN 'Maths'
WHEN science = LEAST(maths, science, social) THEN 'Science'
WHEN social = LEAST(maths, science, social) THEN 'Social'
END AS minimum,
CASE
WHEN maths = GREATEST(maths, science, social) THEN 'Maths'
WHEN science = GREATEST(maths, science, social) THEN 'Science'
WHEN social = GREATEST(maths, science, social) THEN 'Social'
END AS maximum
FROM student;
其中,对于示例数据:
CREATE TABLE student (Student_Name, Maths, Science, Social) AS
SELECT 'A', 20, 30, 10 FROM DUAL UNION ALL
SELECT 'B', 10, 20, 30 FROM DUAL UNION ALL
SELECT 'C', 10, 10, 10 FROM DUAL;
输出:
学生姓名 最低限度 最大限度 一种 社会的 科学 乙 数学 社会的 C 数学 数学
如果您想在最小值或最大值并列的情况下显示所有主题,那么您可以使用:
SELECT student_name,
LTRIM(
CASE WHEN maths = LEAST(maths, science, social) THEN 'Maths' END
|| CASE WHEN science = LEAST(maths, science, social) THEN ', Science' END
|| CASE WHEN social = LEAST(maths, science, social) THEN ', Social' END,
', '
) AS minimum,
LTRIM(
CASE WHEN maths = GREATEST(maths, science, social) THEN 'Maths' END
|| CASE WHEN science = GREATEST(maths, science, social) THEN ', Science' END
|| CASE WHEN social = GREATEST(maths, science, social) THEN ', Social' END,
', '
) AS maximum
FROM student;
哪些输出:
学生姓名 最低限度 最大限度 一种 社会的 科学 乙 数学 社会的 C 数学、科学、社会 数学、科学、社会
db<> 在这里摆弄
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.