Объедините данные нескольких строк в одну строку и разные столбцы: mysql - PullRequest
0 голосов
/ 07 февраля 2019

Предположим, у вас есть следующая базовая таблица:

student_id  student_name  course_name   subscribed 
--------------------------------------------------
    001       vishnu        english      YES
    001       vishnu        arabic       NO
    001       vishnu        chinese      YES

Мне нужно это в следующем формате:

student_id  student_name     english   arabic  chinese
------------------------------------------------------
    001     vishnu             YES       NO     YES     

Мне нужен запрос mysql для этого.Пожалуйста, помогите или направьте меня в правильном направлении.

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Должно быть так, этот запрос работает, только если нет повторяющихся данных, например, дублированный курс английского только для одного студента.

SELECT 
  std.student_id,
  std.student_name,
  (SELECT 
     (CASE WHEN t1.cours_name = 'english' THEN "YES" ELSE "NO" END) 
   FROM table as t1 
   WHERE 
      t1.student_id = std.student_id 
      AND 
      t1.cours_name = 'english') AS english,
  (SELECT 
     (CASE WHEN t1.cours_name = 'arabic' THEN "YES" ELSE "NO" END) 
   FROM table as t1 
   WHERE 
      t1.student_id = std.student_id 
      AND 
      t1.cours_name = 'arabic') AS arabic,
  (SELECT 
     (CASE WHEN t1.cours_name = 'chinese' THEN "YES" ELSE "NO" END) 
   FROM table as t1 
   WHERE 
      t1.student_id = std.student_id 
      AND
      t1.cours_name = 'chinese') AS chinese
FROM 
  table as std
GROUP BY std.student_id;
0 голосов
/ 07 февраля 2019

Вы можете попробовать использовать условное агрегирование

select student_id, student_name,
       max(case when course_name='english' then subscribed end) as english,
       max(case when course_name='arabic' then subscribed end) as arabic,
       max(case when course_name='chinese' then subscribed end) as chinese
from tablename group by student_id, student_name
0 голосов
/ 07 февраля 2019

Я бы сказал, что: (SQL Server Solution)

create table #temp (studentId int, studentName nvarchar(75), course_name nvarchar(75),subscribed nvarchar(3))


insert into #temp values (1,'James','English','Yes')
insert into #temp values (2,'Victor','Arabic','No')
insert into #temp values (2,'Victor','Chinese','Yes')
insert into #temp values (2,'William','Chinese','Yes')

select * from (select * from #temp) t1 pivot(max(subscribed) for course_name in ([English],[Arabic],[Chinese]))t1

studentId   studentName English Arabic  Chinese
    1         James      Yes    NULL    NULL
    2         Victor     NULL   No      Yes
    2         William    NULL   NULL    Yes
0 голосов
/ 07 февраля 2019

Вы должны использовать регистр с группой по.

select
student_id,
student_name,
max(case when course_name='english' then subscribed else 'A' end) as english,
max(case when course_name='arabic' then subscribed else 'A' end) as arabic,
max(case when course_name='chinese' then subscribed else 'A' end) as chinese
from table group by student_id, student_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...