Domanda

Si veda la seguente istruzione 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 

Se è stato aggiunto il quanto segue:

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

sarebbe questo semplicemente escludere le righe con date_diff <= 365?

Quale dovrebbe essere l'effetto della clausola HAVING qui?

EDIT: Io non sto vivendo quello che le risposte qui hanno da dire. Una copia del mdb è a http://hotfile.com/dl/40641614 /2353dfc/test.mdb.html (nessun macro o virus). VISDATA.EXE viene utilizzato per eseguire le query.

EDIT2: Penso che il problema potrebbe essere VISDATA, perché io sto sperimentando risultati diversi tramite DAO

.
È stato utile?

Soluzione

Come già sottolineato, sì, che è l'effetto. Per completezza, 'AVENTI' è come 'WHERE', ma per i valori già aggregati (raggruppati) (ad esempio, MAX in questo caso, o SUM o COUNT, o una qualsiasi delle altre funzioni di aggregazione).

Altri suggerimenti

Si, escluderebbe le righe.

Sì, questo è quello che avrebbe fatto.

in cui si applica a tutte le singole righe, quindi dove MAX (...) sarebbe partita tutte le righe.

avendo è come dove, ma all'interno del gruppo corrente. Ciò significa che si possono fare cose come avere COUNT (*)> 1, che non farà che mostrerà gruppi con più di un risultato.

Quindi, per rispondere alla tua domanda, sarebbe solo includere righe in cui il record nel gruppo che ha la più alta (MAX) data è maggiore di 365. In questo caso si sta anche Selezione MAX (data), quindi sì, esclude righe con date_diff <= 365.

Tuttavia, è possibile selezionare MIN (data) e vedere la data minima in tutti i gruppi che hanno una data massima superiore a 365. In questo caso non escluderebbe "righe" con date_diff <= 365, ma piuttosto gruppi con max (date_diff) <= 365.

Speriamo che non è troppo confuso ...

Si può tentare la cosa sbagliata con il MAX. Maxing la colonna invoice.date si sta effettivamente cercando la fattura più recente associato con il cliente. Così efficacemente la condizione HAVING sta selezionando tutti quei clienti che hanno non had qualsiasi le fatture entro gli ultimi 365 giorni.

E 'questo ciò che si sta cercando di fare? Oppure in realtà cercando di ottenere tutti i clienti che hanno almeno una fattura da più di un anno fa? Se questo è il caso, allora si dovrebbe mettere il MAX di fuori della funzione DateDiff.

Questo dipende dal fatto che si intende righe della tabella o righe nel risultato. La clausola having filtra il risultato dopo il raggruppamento, quindi sarebbe elliminate clienti, non le fatture.

Se si desidera filtrare le nuove fatture, piuttosto che i clienti con nuove fatture, è necessario utilizzare where invece in modo che si filtro prima di raggruppamento:

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

Non vorrei usare una query GROUP BY a tutti. Utilizzando standard di 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));

Utilizzo della modalità di compatibilità 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 chiave qui è quello di ottenere una serie di numeri di clienti che hanno avuto una fattura nel corso dell'ultimo anno, e poi fare un join esterno su quel set di risultati per restituire solo quelli non nel gruppo di clienti con fatture in l'anno scorso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top