1
votes

Combinez plusieurs lignes de données dans la même ligne et différentes colonnes: mysql

Supposons que vous ayez la table de base suivante:

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

J'en ai besoin au format suivant:

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

J'ai besoin de la requête mysql pour ce. Aidez-moi ou guidez-moi dans la bonne direction.


1 commentaires

Envisagez de gérer les problèmes d'affichage des données dans le code de l'application


4 Réponses :


0
votes

Vous devez utiliser le cas avec group by.

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;


0 commentaires

1
votes

Vous pouvez essayer d'utiliser l'agrégation conditionnelle

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 commentaires

0
votes

Je ferais pivoter cela: (Solution SQL Server)

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


3 commentaires

J'obtiens cette erreur ?? 10:46:47 select * from (select * from student_temp) t1 pivot (max (subscribed) for course_name in ([English], [Arabic], [Chinese])) t1 Error Code: 1064. Vous avez un erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de 'pivot (max (abonné) pour course_name en ([anglais], [arabe], [chinois])) t1' à la ligne 1 0,051 sec . @Jorge Lopez


il semble que ma solution soit destinée au serveur SQL, pas à mySQL. Désolé pour ça, Vishnu. Je viens de réaliser la portée de votre question.


Je supprimerais le commentaire, mais les résultats mySQL apparaissent lors de la recherche d'un serveur SQL. Donc, cela pourrait être utile pour d'autres utilisateurs.



0
votes

Cela devrait être comme ça, cette demande ne fonctionne que s'il n'y a pas de données en double, comme un cours d'anglais en double pour un seul étudiant.

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 commentaires