2016-10-25 5 views
0

Ich habe eine Frage bezüglich MSSQL-Anweisung. Also im Grunde das ist meine SQL-Abfrage:SQL-Abfrage Aggregatfunktion in WHERE-Klausel

SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date 
INNER JOIN table2 
INNER JOIN table3 
WHERE avg_date <= ALL 
(SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date 
INNER JOIN table2 
INNER JOIN table3 
GROUP BY table1.col1); 

Was ich versuche, ist innerhalb der Unterabfrage zu tun, erhalte ich die Liste der durchschnittlichen Datum Gruppe von jedem Benutzer. Die Beispieldaten zurückgegeben werden (Benutzername, avg_date):

user1 10 
user2 20 
user3 20 

Dann danach, aus der Abfrage außerhalb, ich brauche das Minimum des durchschnittlichen Datums von der Unterabfrage zurück finden. Jedoch, indem ich dies mache, bekomme ich und Fehlermeldung als von der Abfrage außerhalb, ich vergleiche nur 1 Spalte, wobei die Unterabfrage 2 Spalten zurückgibt.

Die Fehlermeldung ist An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference

jedoch in meiner Unterabfrage muß ich die GROUP BY jeden Benutzer, so kann ich nicht einfach avg SELECT.

Irgendwelche Ideen, wie das zu beheben?

Vielen Dank im Voraus.

+0

Was ist die Fehlermeldung? –

+0

Die Fehlermeldung lautet Ein Aggregat wird möglicherweise nicht in der WHERE-Klausel angezeigt, es sei denn, es befindet sich in einer Unterabfrage, die in einer HAVING-Klausel oder einer Auswahlliste enthalten ist, und die aggregierte Spalte ist eine äußere Referenz. Was ich versuche zu tun, ist innerhalb der Unterabfrage, ich bekomme eine Liste der durchschnittlichen Tagesgruppe von jedem Benutzer. Dann erhalte ich in der äußeren Abfrage das Minimum aus dieser Liste. Irgendwelche Ideen, wie man das erreicht? – hyperfkcb

+0

Ja ist es. Aber aus Gründen der Einfachheit habe ich es entfernt. Ich habe sogar den Spaltennamen umbenannt, als ob ich meinen ursprünglichen Tabellennamen verwenden würde, es wird sehr verwirrend sein – hyperfkcb

Antwort

2

dieses

SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date 
INNER JOIN table2 
INNER JOIN table3 
HAVING avg_date <= (SELECT avg_date from 
(SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date 
INNER JOIN table2 
INNER JOIN table3 
GROUP BY table1.col1) 
); 

Alternative Versuchen:

SELECT * FROM 
(
    SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date 
    INNER JOIN table2 
    INNER JOIN table3 
) outer_table 
WHERE avg_date <= ALL(SELECT avg_date from(SELECT table1.col1,avg(datediff(dd, table2.date, table3.date)) as avg_date 
INNER JOIN table2 
INNER JOIN table3 
GROUP BY table1.col1)); 

Edited für SQL Server

SELECT * FROM 
(
    SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date 
    INNER JOIN table2 
    INNER JOIN table3 
) outer_table 
WHERE avg_date <= ALL(SELECT inner_table.avg_date from 
(SELECT table1.col1,avg(datediff(dd, table2.date, table3.date)) as avg_date 
INNER JOIN table2 
INNER JOIN table3 
GROUP BY table1.col1) inner_table); 
+0

Sorry, aber die Spalte avg_date wird nicht erkannt. Außerdem gibt es einen Syntaxfehler in der letzten Klammer der zweiten Select-Anweisung – hyperfkcb

+0

Haben Sie irgendwelche Ideen? – hyperfkcb

+0

Versuchen Sie in der äußeren Abfrage "where" einzufügen. – Nitin