繁体   English   中英

如何将列转置为行并获取 Oracle 中的最大值和最小值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM