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