SQL: cláusula HAVING

Ver la siguiente statement SQL:

SELECT datediff("d", MAX(invoice.date), Now) As Date_Diff , MAX(invoice.date) AS max_invoice_date , customer.number AS customer_number FROM invoice INNER JOIN customer ON invoice.customer_number = customer.number GROUP BY customer.number 

Si se agregó lo siguiente:

 HAVING datediff("d", MAX(invoice.date), Now) > 365 

¿esto simplemente excluiría las filas con Date_Diff <= 365?

¿Cuál debería ser el efecto de la cláusula HAVING aquí?

EDITAR: No estoy experimentando lo que dicen las respuestas aquí. Una copy del mdb está en http://hotfile.com/dl/40641614/2353dfc/test.mdb.html (sin macros o virus). VISDATA.EXE se está utilizando para ejecutar las consultas.

EDIT2: Creo que el problema podría ser VISDATA, porque estoy experimentando diferentes resultados a través de DAO.

Como ya se señaló, sí, ese es el efecto. Para completar, 'HAVING' es como 'WHERE', pero para los valores ya agrupados (como, por ejemplo, MAX en este caso, o SUM, o COUNT, o cualquiera de las otras funciones agregadas).

Sí, excluiría esas filas.

Sí, eso es lo que haría.

WHERE se aplica a todas las filas individuales, por lo que DONDE MAX (…) coincidiría con todas las filas.

HAVING es como WHERE, pero dentro del grupo actual. Eso significa que puede hacer cosas como HAVING count (*)> 1, que solo mostrará grupos con más de un resultado.

Entonces, para responder a su pregunta, solo includeía las filas donde el logging en el grupo que tiene la date más alta (MAX) es mayor que 365. En este caso, también está seleccionando MAX (date), entonces sí, excluye las filas con date_diff <= 365

Sin embargo, puede seleccionar MIN (date) y ver la date mínima en todos los grupos que tienen una date máxima superior a 365. En este caso, no excluiría "filas" con date_diff <= 365, sino más bien grupos con max ( date_diff) <= 365.

Espero que no sea demasiado confuso …

Puede estar intentando lo incorrecto con su MAX. Al MAXingar la columna invoice.date, está buscando efectivamente la factura más reciente asociada con el cliente. Entonces, efectivamente, la condición HAVING es seleccionar a todos aquellos clientes que no han tenido ninguna factura en los últimos 365 días.

¿Es esto lo que estas tratando de hacer? ¿O está tratando de get todos los clientes que tienen al less una factura desde hace más de un año? Si ese es el caso, entonces debe poner el MAX fuera de la function de dateda.

Eso depende de si quiere decir filas en la tabla o filas en el resultado. La cláusula having filtra el resultado después de la agrupación, por lo que eliminaría a los clientes, no a las facturas.

Si desea filtrar las nuevas facturas en lugar de los clientes con facturas nuevas, debe usar where para filtrar antes de agrupar:

 select datediff("d", max(invoice.date), Now) As Date_Diff, max(invoice.date) as max_invoice_date, customer.number from invoice inner join customer on invoice.customer_number = customer.number where datediff("d", invoice.date, Now) > 365 group by customer.number 

No usaría una consulta GROUP BY en absoluto. Usando Jet SQL estándar:

  SELECT Customer.Number FROM [SELECT DISTINCT Invoice.Customer_Number FROM Invoice WHERE (((Invoice.[Date])>Date()-365));]. AS Invoices RIGHT JOIN Customer ON Invoices.Customer_Number = Customer.Number WHERE (((Invoices.Customer_Number) Is Null)); 

Usando el modo de compatibilidad SQL92:

  SELECT Customer.Number FROM (SELECT DISTINCT Invoice.Customer_Number FROM Invoice WHERE (((Invoice.[Date])>Date()-365));) AS Invoices RIGHT JOIN Customer ON Invoices.Customer_Number = Customer.Number WHERE (((Invoices.Customer_Number) Is Null)); 

La key aquí es get un set de numbers de clientes que hayan tenido una factura en el último año, y luego hacer una OUTER JOIN en ese set de resultados para devolver solo aquellos que no están en el set de clientes con facturas en el último año.