it-swarm.com.de

SQL Server: Verwendung einer Aggregatfunktion wie MAX in einer WHERE-Klausel

Ich möchte den Maximalwert für diesen Datensatz erhalten. Bitte hilf mir:

SELECT rest.field1 
    FROM mastertable AS m
    INNER JOIN  (
        SELECT t1.field1 field1, 
               t2.field2
            FROM table1 AS T1 
            INNER JOIN table2 AS t2 ON t2.field = t1.field 
            WHERE t1.field3=MAX(t1.field3)
        --                  ^^^^^^^^^^^^^^  Help me here.
    ) AS rest ON rest.field1 = m.field
26
Geetha

Sie könnten eine Unterabfrage verwenden ...

WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)

Aber ich würde dies tatsächlich aus der where-Klausel in die join-Anweisung als UND für die ON-Klausel verschieben.

23
dlamblin

Wie Sie bemerkt haben, können Sie in der WHERE -Klausel keine Aggregate verwenden. Dafür gibt es die HAVING -Klausel.

HAVING t1.field3=MAX(t1.field3)
38
Powerlord

Die korrekte Verwendung von max in der having-Klausel besteht darin, zuerst einen Self-Join durchzuführen:

select t1.a, t1.b, t1.c
from table1 t1
join table1 t1_max
  on t1.id = t1_max.id
group by t1.a, t1.b, t1.c
having t1.date = max(t1_max.date)

Im Folgenden wird beschrieben, wie Sie einer Unterabfrage beitreten:

select t1.a, t1.b, t1.c
from table1 t1
where t1.date = (select max(t1_max.date)
                 from table1 t1_max
                 where t1.id = t1_max.id)

Stellen Sie sicher, dass Sie ein einzelnes Dataset erstellen, bevor Sie ein Aggregat verwenden, wenn Sie mit einem Join mit mehreren Tabellen arbeiten:

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
join #dataset d_max
  on d.id = d_max.id
having d.date = max(d_max.date)
group by a, b, c

Unterabfrage-Version:

select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
  on t1.id = t2.id
join table2 t3
  on t1.id = t3.id


select a, b, c
from #dataset d
where d.date = (select max(d_max.date)
                from #dataset d_max
                where d.id = d_max.id)
7
metrix
SELECT rest.field1
FROM mastertable as m
INNER JOIN table1 at t1 on t1.field1 = m.field
INNER JOIN table2 at t2 on t2.field = t1.field
WHERE t1.field3 = (SELECT MAX(field3) FROM table1)
4
Tim Santeford

ja, Sie müssen eine having-Klausel nach der Group by-Klausel verwenden, da die where-Klausel nur zum Filtern der Daten nach einfachen Parametern dient. Die group by-Anweisung gefolgt von einer Having-Anweisung ist die Idee, die Daten zu gruppieren und auf der Basis eines Aggregats zu filtern Funktion......

1
Rohit

Es wird jedoch weiterhin eine Fehlermeldung im Abfrage-Generator angezeigt. Ich benutze SqlServerCe 2008.

SELECT         Products_Master.ProductName, Order_Products.Quantity, Order_Details.TotalTax, Order_Products.Cost, Order_Details.Discount, 
                     Order_Details.TotalPrice
FROM           Order_Products INNER JOIN
                     Order_Details ON Order_Details.OrderID = Order_Products.OrderID INNER JOIN
                     Products_Master ON Products_Master.ProductCode = Order_Products.ProductCode
HAVING        (Order_Details.OrderID = (SELECT MAX(OrderID) AS Expr1 FROM Order_Details AS mx1))

Ich habe WHERE durch HAVING ersetzt, wie von @powerlord gesagt. Aber es wird immer noch ein Fehler angezeigt.

Fehler beim Parsen der Abfrage. [Token-Zeilennummer = 1, Token-Zeilenversatz = 371, Token in error = SELECT]

0
Kamal