簡體   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