2009-09-25 8 views
19

Quiero obtener el valor máximo para este registro. Por favor, ayúdame:Servidor Sql: cómo utilizar una función agregada como MAX en una cláusula 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

No soy un gurú de SQL pero ¿funciona o no? Ni siquiera declara con qué tiene problemas y si su solución publicada funciona o no. –

+0

Vas a tener que explicarme lo que quieres para que yo entienda esta pregunta. – tster

+0

¿hay alguna solución para obtener el resultado correcto? –

Respuesta

18

se puede utilizar una consulta sub ...

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

Pero en realidad me gustaría mover esto hacia fuera de la cláusula dónde y en la instrucción de combinación, como y para el EN cláusula.

+0

La consulta secundaria es la única forma posible de lograr lo que desea. –

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

Como se ha notado, la cláusula WHERE no le permiten usar agregados en ella. Para eso está la cláusula HAVING.

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

Como nota al margen (más de 5 años después), la cláusula 'HAVING' está pensada para ser utilizada con elementos agrupados. Sin embargo, funciona con cláusulas agregadas ('MIN',' MAX', 'AVG') en la mayoría de los motores SQL, incluso sin una cláusula' GROUP BY'. – Powerlord

1

sí es necesario utilizar una cláusula que tiene después de la cláusula GROUP BY, como el dónde es sólo para filtrar los datos sobre los parámetros simples, pero el grupo por seguida de una declaración Tener es la idea de agrupar la y filtrar los datos en base a alguna función de agregado ......

5

la forma correcta de utilizar como máximo en la cláusula teniendo es mediante la realización de una auto se unen en primer lugar:

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) 

la siguiente es la forma de se uniría con un subquer 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) 

Asegúrese de crear un único conjunto de datos antes de utilizar un agregado cuando se trata de un multi-unión de tablas:

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 versión de consulta:

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

Pero su todavía dando un mensaje de error en Query Builder. Estoy 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)) 

I sustituidas con tener Según lo dicho por @powerlord. Pero sigue mostrando un error.

Error al analizar la consulta. [Token line number = 1, Token line offset = 371, Token in error = SELECT]

+0

Creo que puedes simplificar la cláusula HAVING aquí simplemente 'HAVING Order_Details.OrderID = MAX (Order_Details.OrderID)' – Powerlord

Cuestiones relacionadas