2016-03-31 13 views
1

Ich hatte zwei Tabellen nämlich Studenten und bestanden. In beiden Tabellen ist eine Spalte üblich, d.h. ID. Ich brauche die Schülerdaten einschließlich der Pass-Tabellendetails in nur einer horizontalen Reihe, jetzt wird es in drei verschiedenen Reihen angezeigt. Die Daten der Schüler werden immer redundanter.So lösen Sie die Abfrage mit JOIN

Studenten

ID Name Age 
1  XYZ 25 
2  ABC 15 

Pass

ID subject  External Internal 
1  English  20  22 
1  Maths   25  15 
1  Science  50  25 
2  history  15  14 
2  Geography  14  21 

Erwartete Ausgabe:

ID NAME AGE       Pass 
1 XYZ 25  English  20  22 Maths   25  15 Science  50  25 
2 ABC 15  history  15  14 Geography  14  21 

tatsächliche Ausgang:

ID NAME AGE SUBJECT  EXTERNAL INTERNAL 
1 XYZ 25 English  20  22 
1 XYZ 25 Maths   25  15 
1 XYZ 25 Science  50  25 

SQL QUERY:

SELECT * FROM students LEFT JOIN pass ON students.ID=pass.ID order by students.ID 

Ist es möglich, in einer horizontalen Reihe zu zeigen? Ich habe Join versucht, aber ich denke, es funktioniert nicht.

+2

Geben Sie für 'PIVOTING' – sagi

+0

beitreten wird nicht funktionieren .. Sie müssen Aggregatfunktion verwenden .. In Orakel benutzt ich LISTAGG .. Für Orakel I wie folgt verwendet. http://tech.pranavmaniar.in/oracle-aggregate-string-into-csv/ ... Für mysql sollten ähnliche Dinge auch existieren –

Antwort

0

Versuchen Sie dies, aber Sie haben die Ergebnisse in 1 Spalte.

SELECT 
    s.*, 
    GROUP_CONCAT(CONCAT(p.subject,' : ',p.External,' : ',p.Internal) SEPARATOR ' -- ') 
FROM students s 
LEFT JOIN pass p ON s.ID=p.ID 
GROUP BY p.ID 
ORDER BY s.ID; 
+0

Es ist nicht das, was er fragte – sagi

0

eine hässliche Lösung:

SELECT ID,NAME, 
group_concat(concat(SUBJECT,"==ex=>",EXTERNAL,"==IN=>",INTERNAL,"==|"), SEPARATOR "--|") 
FROM students LEFT JOIN pass ON students.ID=pass.ID 
group by ID,NAME order by students.ID 
+0

Es ist nicht das, was er fragte entweder – sagi

0

versuchen it-

SELECT st.ID, st.name, st.age, 
SUBSTRING_INDEX(GROUP_CONCAT(ps.subject),',',1) AS subject_1, 
SUBSTRING_INDEX(GROUP_CONCAT(ps.external),',',1) AS external_1, 
SUBSTRING_INDEX(GROUP_CONCAT(ps.interval),',',1) AS interval_1, 
IF((LENGTH(GROUP_CONCAT(ps.subject)) - LENGTH(GROUP_CONCAT(ps.subject SEPARATOR ''))) < 1,'',SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(ps.subject),',',2),',',-1)) AS subject_2, 
IF((LENGTH(GROUP_CONCAT(ps.external)) - LENGTH(GROUP_CONCAT(ps.external SEPARATOR ''))) < 1,'',SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(ps.external),',',2),',',-1)) AS external_2, 
IF((LENGTH(GROUP_CONCAT(ps.interval)) - LENGTH(GROUP_CONCAT(ps.interval SEPARATOR ''))) < 1,'',SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(ps.interval),',',2),',',-1)) AS interval_2, 
IF((LENGTH(GROUP_CONCAT(ps.subject)) - LENGTH(GROUP_CONCAT(ps.subject ''))) < 2,'',SUBSTRING_INDEX(GROUP_CONCAT(ps.subject),',',-1)) AS subject_3 
IF((LENGTH(GROUP_CONCAT(ps.external)) - LENGTH(GROUP_CONCAT(ps.external ''))) < 2,'',SUBSTRING_INDEX(GROUP_CONCAT(ps.external),',',-1)) AS external_3 
IF((LENGTH(GROUP_CONCAT(ps.interval)) - LENGTH(GROUP_CONCAT(ps.interval ''))) < 2,'',SUBSTRING_INDEX(GROUP_CONCAT(ps.interval),',',-1)) AS interval_3 
FROM students AS st 
LEFT JOIN pass AS ps ON st.ID=ps.ID 
GROUP BY students.ID; 
+0

Wie ich tat führe diese Abfrage nicht aus, lass es mich wissen, wenn du ein Problem hast, damit ich es korrigieren kann. –

0

Sie dynamischen Schwenk verwenden könnten Ihr Problem zu lösen. Ein Ansatz könnte sein, diese Aussagen zu verwenden:

SELECT  GROUP_CONCAT(tmp.x) 
    FROM (
     SELECT  CONCAT('MAX(IF(p.subject = ''', p.subject, ''', p.External, NULL)) ', p.subject, '_External, MAX(IF(p.subject = ''', p.subject, ''', p.Internal, NULL)) ', p.subject, '_Internal') x 
      FROM pass p 
     GROUP BY p.subject 
     ) tmp 
    INTO @query; 

SELECT  CONCAT('SELECT s.*, ', @query, ' FROM students s JOIN pass p ON p.ID = s.ID GROUP BY p.ID') 
    INTO @sql; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
Verwandte Themen