2017-04-20 7 views
0

ich eine SQL-Tabelle haben Agenten genannt, die wie folgt aussieht: SQL verschachtelt Summe Abfrage

tblAgent

Es

ist ein Anspruch in den Daten, dass bestimmte Mittel ein höheres Gehalt als die Summe dieser Mittel verdienen dass sie beaufsichtigen. Ich habe die folgende SQL-Abfrage geschrieben, um den Namen des Agenten, sein persönliches Gehalt und die Summe der Gehälter derjenigen, die er überwacht, abzurufen. Nur Agenten, deren persönliches Gehalt höher als 60000 ist, müssen angezeigt werden.

SELECT Agent.Agentname AS ["Supervisor Name"], Agent.Salary, 
    (SELECT SUM(Agent.salary) FROM Agent 
    WHERE Agent.Supervisor IS NOT NULL 
    GROUP BY Agent.Supervisor;) 
AS ['Sum of Subordinate Salaries'] 
FROM Agent 
WHERE (((Agent.[Supervisor]) Is Not Null) AND ((Agent.[salary])>=60000)) 
GROUP BY Agent.AgentName 

Ich erhalte eine Fehlermeldung, durch welches sagt: „Ihre Anfrage enthält nicht den angegebenen Ausdruck‚Gehalt‘als Teil einer Aggregatfunktion“.

Wie kann ich die Abfrage korrigieren und die gewünschten Ergebnisse daraus erhalten?

+0

Wenn Sie dieselbe Tabelle mehrmals in einer Abfrage verwenden, qualifizieren Sie die Spalten mit Tabellenaliasnamen - um sie klarer zu machen. – jarlh

+0

@jarlh Ich habe es getan, aber der gleiche Fehler tritt immer noch auf. –

+0

Gehalt ist weder aggregiert noch in der 'Gruppe von' ... Das ist das Problem – JohnHC

Antwort

1
create table #agent (agentno varchar(5),agentname varchar(30),functn varchar(10),supervisor varchar(30),salary int) 

Insert into #agent values('A1','Jacobson','Manager','O1',120000), ('A2','Patel','Sales','A1',25000),('A3','Clark','Sales','A1',30000), 
('A4','Mabaso','Admin','A1',35000),('B1','Letele','Manager','O1',100000), ('B2','Smit','Sales','B1',35000), ('B3','Ho','Sales','B1',30000), 
('B4','Kruger','Admin','B1',40000),('C1','Mohd','Manager','O1',80000),('C2','Visser','MandR','C1',58000), 
('C3','Davie','Admin','C1',42000),('C4','Nakosi','MandR','C1',60000),('C5','Lai','Admin','C4',38000) 

select sup.agentname as supervisor_name ,SUM(agn.salary) as subordinate_salary_sum,sup.salary as supervisor_salary 
from #agent agn 
inner join #agent sup 
on agn.supervisor=sup.agentno 
where agn.salary>=60000 
group by sup.agentname,sup.salary 

Bei der Verwendung von Gruppe sollten die Spalten in select-Anweisung mit der Gruppe durch Anweisung vorhanden sein oder in einem Aggregat sein sollte function.In Ihre Anfrage agent.salary von in der Gruppe zu erwarten war.