2017-10-05 2 views
0

Ich habe die folgenden Tabellen Job description und Candidate.
Jede Stellenbeschreibung kann sich auf n Kandidaten beziehen. Die Kandidaten stammen aus verschiedenen Quellen (a, b, c d) - candidate.source.Anhängen von Daten aus verschiedenen Tabellen - mysql

Ich möchte eine einzelne Abfrage mir die JD-IDs aufzulisten, mit Zahl von Kandidaten für jede Quelle für jeden JD, wie unten dargestellt:

JD id | candidate name | count of candidates - source a | count of candidates - source b | count of candidates - source | c.............. 
+0

Ist die Anzahl von Quellen erhalten, gruppiert nach Kandidatennamen nicht? Außerdem scheint es seltsam, dass Sie eine Anzahl von Kandidaten und einen (zufälligen?) Kandidatennamen in derselben Zeile haben möchten. Es wäre hilfreich, wenn Sie die Tabellenstrukturen mit Beispieldaten und dem erwarteten Ergebnissatz mit Beispieldaten in einem flachen Text hinzufügen können. Sie können auch http://sqlfiddle.com/ verwenden, wenn Sie Ihr aktuelles SQL, das Sie bisher versucht haben, hinzufügen möchten. – Nope

+0

Kandidat Name ist ein Fehler - bedauern Sie die Verwirrung. –

Antwort

2

mit der Abfrage als Vorlage Versuchen:

select 
JobDescriptionName, 
SUM(ACount) CountOfCandidatesOfA , 
SUM(BCount) CountOfCandidatesOfB, 
SUM(CCount) CountOfCandidatesOfC , 
SUM(DCount) CountOfCandidatesOfD 
from 
(select JobDescriptionID, (CASE WHEN Source = 'a' THEN 1 ELSE 0 END) AS ACount, 
      (CASE WHEN Source = 'b' THEN 1 ELSE 0 END) AS BCount, 
      (CASE WHEN Source = 'c' THEN 1 ELSE 0 END) AS CCount, 
      (CASE WHEN Source = 'd' THEN 1 ELSE 0 END) AS DCount 
      from Candidate) AS DerivedCandidate 

inner join JobDescription ON JobDescription.JobDescriptionID = DerivedCandidate.JobDescriptionID group by JobDescriptionID; 
0
SELECT JD id, COUNT(Candidate), source 
FROM table1 
GROUP BY JD id,source 
+0

Dies erzeugt keine Spalte für jede Quelle in der Ausgabe. – Nope

1

ich weiß, es ist schon eine akzeptierte Antwort, aber in dem Bemühen, mich mehr über SQL hier lernt, ist eine alternative Möglichkeit die case direkt in dem Anfang wählen, ohne die Unterauswahl Anwendung:

Select 
    jd.id, 
    jd.name, 
    sum(case when c.source = 'a' then 1 else 0 end) as sourceA, 
    sum(case when c.source = 'b' then 1 else 0 end) as sourceB, 
    sum(case when c.source = 'c' then 1 else 0 end) as sourceC, 
    sum(case when c.source = 'd' then 1 else 0 end) as sourceD 
from JobDescription as jd 
join Candidate as c on c.jobId = jd.id 
group by jd.id, jd.name 

SQL Fiddle Demo


Verwandte Themen