2009-09-25 7 views
19

Chcę uzyskać maksymalną wartość dla tego rekordu. Proszę mi pomóc:Serwer Sql: Jak używać funkcji agregującej, takiej jak MAX w klauzuli WHERE

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 
+0

Nie jestem guru SQL, ale działa to czy nie? Nie określasz nawet, z czym masz problemy i czy Twoje rozwiązanie działa, czy nie. –

+0

Będziesz musiał wyjaśnić, co chcesz lepiej dla mnie, aby zrozumieć to pytanie. – tster

+0

jest jakieś rozwiązanie, aby uzyskać prawidłowy wynik? –

Odpowiedz

18

Można użyć kwerendy sub ...

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

Ale chciałbym faktycznie przenieść to z klauzuli WHERE i dołączyć do rachunku, jako i dla ON klauzula.

+0

Zapytanie podrzędne jest jedynym możliwym sposobem osiągnięcia tego, co chcesz. –

3
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) 
30

Jak zauważyłeś, klauzula WHERE nie zezwala na używanie w niej agregatów. Do tego służy klauzula HAVING.

HAVING t1.field3=MAX(t1.field3) 
+2

Na marginesie (5 lat później) klauzula "HAVING" jest faktycznie przeznaczona do użycia z pogrupowanymi elementami. Jednak działa z klauzulami agregującymi ('MIN',' MAX', 'AVG') w większości silników SQL, nawet bez klauzuli" GROUP BY ". – Powerlord

1

tak trzeba użyć klauzuli HAVING po klauzuli GROUP BY, jak gdzie jest tylko, aby filtrować dane na prostych parametrów, ale grupę, a następnie uwzględniając oświadczenie jest pomysłem grupy w dane i filtrować je na podstawie jakiegoś zagregowanej funkcji ......

5

prawidłowe sposobem użycia max w mającej klauzuli jest przeprowadzając siebie przyłączyć pierwszy:

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) 

Poniższy sposób można przyłączę się z podstępem y:

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) 

Pamiętaj, aby utworzyć jeden zestaw danych przed użyciem kruszywa w kontaktach z wielu stołach dołączyć:

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 

Sub wersja zapytania:

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) 
0

Ale to nadal dając komunikat o błędzie w Kreatorze zapytań. Używam 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)) 

Wymieniłem GDZIE z posiadaniem jak powiedział @powerlord. Ale wciąż pokazuje błąd.

Błąd analizy zapytania. [Numer linii tokena = 1, przesunięcie linii Token = 371, Token w błędzie = SELECT]

+0

Myślę, że można uprościć klauzulę HAVING do "HAVING Order_Details.OrderID = MAX (Order_Details.OrderID)" – Powerlord

Powiązane problemy