Как я могу объединить несколько строк в одну строку в таблице

#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;