![](/img/trans.png)
[英]Transform multiple rows into a single row in same table (reduce by merge group by)
[英]How can i Merge multiple rows into single row in a table
您可以按如下方式使用枢轴:
Select * from your_table
Pivot (max(marks) as marks
For subject in ('maths', 'physics', 'chemistry'))
您可以将查询与PIVOT
操作结合使用
WITH
marks_data (id, subject, marks)
AS
(SELECT 1, 'maths', 100 FROM DUAL
UNION ALL
SELECT 1, 'physics', 95 FROM DUAL
UNION ALL
SELECT 1, 'chemistry', 99 FROM DUAL
UNION ALL
SELECT 2, 'maths', 90 FROM DUAL
UNION ALL
SELECT 2, 'physics', 89 FROM DUAL
UNION ALL
SELECT 2, 'chemistry', 96 FROM DUAL)
SELECT *
FROM (SELECT * FROM marks_data)
PIVOT (MAX (subject) AS subject, MAX (marks) AS marks
FOR subject
IN ('maths' AS maths, 'physics' AS physics, 'chemistry' AS chemistry));
ID MATHS_SUBJECT MATHS_MARKS PHYSICS_SUBJECT PHYSICS_MARKS CHEMISTRY_SUBJECT CHEMISTRY_MARKS
_____ ________________ ______________ __________________ ________________ ____________________ __________________
1 maths 100 physics 95 chemistry 99
2 maths 90 physics 89 chemistry 96
您可以使用条件聚合:
select id,
max(case when subject = 'maths' then marks end) as maths_marks,
max(case when subject = 'physics' then marks end) as physics_marks,
max(case when subject = 'chemistry' then marks end) as chemistry_marks
from t
group by id;
您正在对齐每个主题中的值,所以我不明白您为什么需要主题名称。 但是您也可以轻松地将其包含在内:
select id,
'maths' as subject_1,
max(case when subject = 'maths' then marks end) as marks_1,
'physics' as subject_2,
max(case when subject = 'physics' then marks end) as marks_2,
'chemistry' as subject_3,
max(case when subject = 'chemistry' then marks end) as marks_3
from t
group by id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.