2016-05-13 13 views
0

Ich brauche Abfrage, die Datensätze aus zwei Tabellen abrufen, aber Spaltenname sollte auf Datensätze in zweite Tabelle basieren. Einzelheiten sind unterWie Datensatz aus zwei Tabellen abgerufen wird, geben Sie den Spaltennamen basierend auf zweiten Tabellenzeilensätzen an

Mein erster Tisch

Emp Table 
emp_id  emp_name 
    1   Abc 
    2   XYZ 
    3   PQR 

Mein zweiter Tisch

Salary Table 
id emp_id month salary 
1  1  1  4000 
2  1  2  3000 
3  2  1  5000 
4  2  2  4500 

Ich brauche eine Ausgabe wie,

emp_id emp_name  jan feb 
    1   Abc  4000 3000 
    2   XYZ  5000 4500 

ich in der Lage bin, dies zu erreichen, indem sie beitreten Verwendung links aber für jeden Monat muss ich es in Abfrage wie hinzufügen,

select e.emp_id,e.emp_name,j.month as Jan,f.month as Feb from emp e 
Left Join salary j on e.emp_id=j.emp_id and j.month=1  
Left Join salary f on e.emp_id=f.emp_id and f.month=2 

Oben Arbeit für mich Aber was ist nicht machbar. Ich habe Master-Tabelle für Monat auch.

Month Table 
id  Name 
1  Jan 
2  Feb 
3  March 
5  April 

Ich mag Rekord holen für spezifischen Monat Zeit für (Jan & Februar).

Bitte helfen Sie mir, diesen schnelleren Weg zu erreichen.

+0

Können Sie bitte die Master-Tabelle für Monat posten? –

Antwort

1

Bedingte Aggregation:

SELECT 
    e.emp_id, 
    e.emp_name, 
    [Jan] = MAX(CASE WHEN s.[month] = 1 THEN s.salary END), 
    [Feb] = MAX(CASE WHEN s.[month] = 2 THEN s.salary END), 
    [Mar] = MAX(CASE WHEN s.[month] = 3 THEN s.salary END), 
    [Apr] = MAX(CASE WHEN s.[month] = 4 THEN s.salary END), 
    [May] = MAX(CASE WHEN s.[month] = 5 THEN s.salary END), 
    [Jun] = MAX(CASE WHEN s.[month] = 6 THEN s.salary END), 
    [Jul] = MAX(CASE WHEN s.[month] = 7 THEN s.salary END), 
    [Aug] = MAX(CASE WHEN s.[month] = 8 THEN s.salary END), 
    [Sep] = MAX(CASE WHEN s.[month] = 9 THEN s.salary END), 
    [Oct] = MAX(CASE WHEN s.[month] = 10 THEN s.salary END), 
    [Nov] = MAX(CASE WHEN s.[month] = 11 THEN s.salary END), 
    [Dec] = MAX(CASE WHEN s.[month] = 12 THEN s.salary END) 
FROM Emp e 
LEFT JOIN Salary s 
    ON s.emp_id = e.emp_id 
GROUP BY 
    e.emp_id, e.emp_name 

ONLINE DEMO

+0

Hallo Felix, Danke für die schnelle Antwort. Ich habe eine Frage: Was, wenn das Gehalt String ($ 4000) ist, welche Aggregatfunktion sollte ich verwenden? Wenn ich Max entfernte, gibt es einen Fehler. –

+0

Die Verwendung von 'MAX' ist in Ordnung. –

+0

Wenn ich Null durch Leerzeichen ersetzen möchte? –

Verwandte Themen