2009-09-25 9 views
19

Desidero ottenere il valore massimo per questo record. Please help me:Server Sql: come utilizzare una funzione di aggregazione come MAX in una clausola 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

Non sono un guru SQL ma funziona o no? Non hai nemmeno detto cosa stai avendo problemi e se la tua soluzione pubblicata funziona o no. –

+0

Dovrai spiegare quello che vuoi meglio per me capire questa domanda. – tster

+0

c'è qualche soluzione per ottenere il risultato corretto? –

risposta

18

Si potrebbe utilizzare una query sub ...

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

Ma mi sarebbe effettivamente spostare questo fuori della clausola dove e in join, come e per l'ON clausola.

+0

La query secondaria è l'unico modo possibile per ottenere ciò che desideri. –

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

Come avete notato, la clausola WHERE non consente di utilizzare aggregati in esso. Questo è ciò che la clausola HAVING è per.

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

Come nota a margine (più di 5 anni dopo), la clausola 'HAVING' è in realtà destinata all'uso con elementi raggruppati. Tuttavia, funziona con clausole aggregate ('MIN',' MAX', 'AVG') nella maggior parte dei motori SQL anche senza una clausola' GROUP BY'. – Powerlord

1

sì, è necessario utilizzare una clausola having dopo che il gruppo dalla clausola, come il quale è solo per filtrare i dati sui parametri semplici, ma di gruppo da seguita da una dichiarazione Avere è l'idea di gruppo dati e filtrare sulla base di qualche funzione di aggregazione ......

5

il modo corretto di utilizzare max nella clausola having è eseguendo un self join prima:

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) 

il seguente è come si si unirebbe a una sottomissione 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) 

Assicurarsi di creare un unico set di dati prima di utilizzare un aggregato quando si tratta di un multi-tavolo join:

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 versione query:

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

ma la sua ancora dando un messaggio di errore in Query Builder. Sto usando 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)) 

ho sostituito DOVE di avere come detto da @powerlord. Ma mostra ancora un errore.

Errore durante l'analisi della query. [Token line number = 1, Token line offset = 371, Token in error = SELECT]

+0

Penso che si possa semplificare qui la clausola HAVING semplicemente "HAVING Order_Details.OrderID = MAX (Order_Details.OrderID)' – Powerlord

Problemi correlati