2016-07-20 3 views
0

Ich habe zwei Tabellen mit dem folgende Schema:Das höchste Durchschnittsgehalt einer Abteilung mithilfe von Joins in SQL ermitteln?

Table 1 
------- 
empID 
empName 


Table 2 
------- 
empID 
department 
salary 

die Tabellen Unter der Annahme ist: Tabelle 1:

empID|empName 
1 A 
2 B 
3 C 
4 D 
5 E 
6 F 
7 G 
8 H 
9 I 
10 J 

Tabelle 2:

empID|department|salary 
1 X 10 
2 X 10 
3 X 10 
4 Y 5 
5 Y 5 
6 Y 5 
7 Y 5 
8 Y 5 
9 Z 3 
10 Z 3 

Ich brauche die Abteilungsnamen finden mit dem höchsten durchschnittlichen Gehalt und zeigen sie zusammen mit den Angestelltennamen an.

Der Ausgang ich erwarte ist:

empName|department|salary 
A   10   
B X 10 
C   10 

Das war eine Interview-Frage, und ich bin neu zu erstellen diese aus dem Gedächtnis, so dass es nicht perfekt sein könnte. Ich nehme SQL nach einer Lücke von mehr als 2 Jahren auch auf. Bitte schlage vor, wenn mir etwas fehlt.

Die Abfrage, die ich gebildet habe, ist:

SELECT 
    table1.empName, 
    TOP(1) AVG(table2.salary), 
    table2.department 
FROM 
    table1 
INNER JOIN 
    table2 
    ON table1.empID = table2.empID 
GROUP BY 
    table2.department 
+0

Was haben Sie versucht? – Nicarus

+0

Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie Ihre Fragequalität verbessern und bessere Antworten erhalten. –

+0

@JuanCarlosOropeza hast du Probleme meine Frage zu verstehen? –

Antwort

1

Ihre Syntax sieht aus wie SQL Server (die "TOP 1"). In dieser Datenbank, würde ich so etwas tun:

SELECT TOP (1) WITH TIES t1.empName, t2.salary, t2.department 
FROM table1 t1 INNER JOIN 
    table2 t2 
    ON t1.empID = t2.empID 
ORDER BY AVG(t2.salary) OVER (PARTITION BY t2.department) DESC; 

Eine allgemeine Lösung:

SELECT empName, salary, department 
FROM (SELECT t.*, 
      DENSE_RANK() OVER (ORDER BY avg_salary) as seqnum 
     FROM (SELECT t1.empName, t2.salary, t2.department, 
        AVG(t2.salary) OVER (PARTITION BY t2.department) as avg_salary 
      FROM table1 t1 INNER JOIN 
       table2 t2 
       ON t1.empID = t2.empID 
      ) t 
    ) t 
WHERE seqnum = 1; 
1

Nach dem, was ich aus Ihrer Frage ziehen, würde ich es auf diese Weise nähern.

WITH department_rank AS 
(
SELECT 
    department, 
    RANK() OVER(ORDER BY avg_salary DESC) AS avg_salary_rank 
FROM 
    (
    SELECT 
     department, 
     AVG(salary) AS avg_salary 
    FROM 
     table2 
    GROUP BY 
     department 
    ) tbl 
) 

SELECT 
    dept.department, 
    emp.empID, 
    emp.empName, 
    dept.salary 
FROM 
    table2 dept 
JOIN 
    table1 emp 
    ON (emp.empID = dept.empID) 
JOIN 
    department_rank drnk 
    ON (drnk.department = dept.department) 
    AND (drnk.avg_salary_rank = 1) --Top ranked department based on average salary 

OUTPUT:

enter image description here

+0

danke für die Antwort. Funktionen in SQL zu machen ist für mich völlig neu. Ich verstehe die Logik hinter deinem Code. Ich habe mein OP bearbeitet und einige weitere Details hinzugefügt. Ich dachte, diese Frage könnte mit nur einer Abfrage erledigt werden. Bitte überprüfen Sie den bearbeiteten Beitrag. –

+0

Ich folge nicht, was Sie fragen. Ich habe einen Screenshot der Ausgabe hinzugefügt - es gibt Ihnen das Ergebnis, das Sie suchen. Könnten Sie das klären? – Nicarus

+0

Ja, die Ausgabe, die Sie bekommen haben, ist was ich will. –