Pregunta

Vea la siguiente instrucción 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 añadió la siguiente:

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

sería esto simplemente excluir filas con date_diff <= 365?

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

EDIT: yo no estoy experimentando lo que las respuestas aquí están diciendo. Una copia de la MDB es en http://hotfile.com/dl/40641614 /2353dfc/test.mdb.html (sin macros o virus). VISDATA.EXE está siendo utilizado para ejecutar las consultas.

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

.
¿Fue útil?

Solución

Como ya se señaló, sí, que es el efecto. Para completar, 'tener' es como 'dónde', pero para los valores ya agregados (agrupados) (tales como, MAX en este caso, o SUM o COUNT, o cualquiera de las otras funciones de agregado).

Otros consejos

Sí, sería excluir aquellas filas.

Sí, eso es lo que haría.

¿Dónde se aplica a todas las filas individuales, por lo que donde Max (...) se correspondería con todas las filas.

QUE TIENE es como WHERE, pero dentro del grupo actual. Esto significa que puede hacer cosas como tener la cuenta (*)> 1, que sólo mostrará los grupos con más de un resultado.

Así que para responder a su pregunta, sólo se incluyen las filas donde el registro en el grupo que tiene la más alta (MAX) la fecha es mayor que 365. En este caso también se seleccionará MAX (fecha), así que sí, que excluye filas con date_diff <= 365.

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

Es de esperar que no es demasiado confuso ...

Puede estar intentando la cosa mal con su MAX. Llevando al máximo la columna de la invoice.date que busca de manera efectiva para la factura más reciente asociado con el cliente. Así que efectivamente la condición HAVING es la selección de todos aquellos clientes que tienen no Had cualquier las facturas dentro de los últimos 365 días.

Es esto lo que estamos tratando de hacer? ¿O en realidad tratando de llegar a todos los clientes que tienen al menos una factura desde hace más de un año? Si ese es el caso, entonces usted debe poner el MAX fuera de la función DateDiff.

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

Si desea filtrar las nuevas facturas en lugar de los clientes con nuevas facturas, se debe utilizar where lugar para que se filtra antes de agrupación:

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. El uso estándar de Jet SQL:

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

Uso de 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 clave aquí es conseguir un conjunto de los números de los clientes que han tenido una factura en el último año, y luego hacer una combinación externa en ese conjunto de resultados para devolver sólo los que no están en el conjunto de los clientes con facturas en el el año pasado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top