#mysql #sql #oracle
#mysql #sql #Oracle
Вопрос:
Комментарии:
1. Вы используете MySQL или Oracle?
2. Почему? Теперь данные отображаются так, как они должны быть смоделированы в реляционной базе данных. Для вашего нового формата вы даже заранее знаете общее количество «предметов»? Всегда ли это три предмета для каждого (студенческого) идентификатора? Если нет, вывод даже не имеет смысла как таблица.
Ответ №1:
Вы можете использовать сводную таблицу следующим образом:
Select * from your_table
Pivot (max(marks) as marks
For subject in ('maths', 'physics', 'chemistry'))
Ответ №2:
Вы можете использовать запрос с 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
Ответ №3:
Вы можете использовать условную агрегацию:
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;