Query SQL per mostrare solo i record di acquisto più recenti per singoli articoli alimentari


8

Sto lavorando con un sistema di acquisto / fatturazione di alimenti in MS Access 2013 e sto cercando di creare una query SQL che restituirà il prezzo di acquisto più recente per ogni singolo prodotto alimentare.

Ecco un diagramma delle tabelle con cui sto lavorando: Tabelle nel database MS Access

La mia comprensione di SQL è molto semplice e ho provato la seguente query (errata), nella speranza che restituisse solo un record per articolo (a causa DISTINCTdell'operatore) e che restituisse solo l'acquisto più recente (da quando l'ho fatto ORDER BY [Invoice Date] DESC)

SELECT DISTINCT ([Food items].Item), 
    [Food items].Item, [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], Invoices.[Invoice Date]
FROM Invoices
INNER JOIN ([Food items] 
    INNER JOIN [Food purchase data] 
    ON [Food items].ID = [Food purchase data].[Food item ID]) 
ON Invoices.ID = [Food purchase data].[Invoice ID]
ORDER BY Invoices.[Invoice Date] DESC;

Tuttavia, la query sopra restituisce semplicemente tutti gli acquisti di cibo (ovvero più record per ogni record in [Food items]), con i risultati ordinati in base alla data. Qualcuno può spiegarmi cosa sto fraintendendo DISTINCTsull'operatore? Cioè, perché non restituisce solo un record per ogni elemento in [Food items]?

E ancora al punto: qual è il modo più semplice per me di estrarre i dati di acquisto degli alimenti più recenti per ogni singolo prodotto alimentare, data la struttura della tabella mostrata sopra ? Non mi interessa davvero tanto l'efficienza quanto la semplicità (il database con cui sto lavorando è piuttosto piccolo - ci vorranno anni prima che sia compreso tra decine di migliaia di record). Mi interessa di più che la query sia comprensibile per qualcuno con poca conoscenza di SQL.

AGGIORNAMENTO: Così ho provato, entrambe le risposte suggerite di seguito, e nessuna delle due funziona (generano solo errori di sintassi).

Sulla base dei suggerimenti seguenti e delle successive letture online, ho scritto la seguente nuova query, utilizzando la funzione aggregata max()e una GROUP BYclausola:

SELECT [Food purchase data].[Food item ID], [Food purchase data].[Price per unit], max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM [Food purchase data], Invoices
GROUP BY [Food purchase data].[Food item ID], [Food purchase data].[Price per unit];

Ma ho ancora lo stesso problema: cioè vedo ancora più di un risultato per ogni alimento. Qualcuno può spiegare perché questa query non sta solo restituendo l'acquisto più recente per ogni prodotto alimentare?

AGGIORNAMENTO 2 (RISOLTO!) :

Nessuna delle risposte di seguito ha funzionato abbastanza, ma sulla base di una pesante modifica della risposta di Vladimir di seguito , sono stato in grado di creare le seguenti query, che sembrano dare i risultati corretti.

Innanzitutto, ho creato questa vista e l'ho chiamata "LatestInvoices":

SELECT InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate, InvoicesMaxDate.MaxID
FROM [Food purchase data], Invoices, (SELECT [Food purchase data].[Food item ID] AS ItemID, MAX(Invoices.[Invoice Date]) AS MaxDate, MAX(Invoices.[Invoice ID]) AS MaxID
                FROM [Food purchase data], Invoices
                WHERE Invoices.[Invoice ID] = [Food purchase data].[Invoice ID]
                GROUP BY [Food purchase data].[Food item ID]
         )  AS InvoicesMaxDate
WHERE InvoicesMaxDate.MaxID = [Food purchase data].[Invoice ID] AND
                      InvoicesMaxDate.ItemID = [Food purchase data].[Food item ID] AND 
                      InvoicesMaxDate.MaxDate = Invoices.[Invoice Date]
GROUP BY InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate,  InvoicesMaxDate.MaxID

Quindi ho scritto un'altra query per inserire i campi di cui avevo bisogno:

SELECT [Food items].ID AS FoodItemID, [Food items].Item AS FoodItem, [Food purchase data].[Price], [Food purchase data].[Price per unit], [Food purchase data].[Purchase unit], LatestInvoices.MaxDate as InvoiceDate
FROM [Food items], [Food purchase data], LatestInvoices
WHERE LatestInvoices.[MaxID] = [Food purchase data].[Invoice ID] AND
             LatestInvoices.ItemID = [Food purchase data].[Food item ID] AND
             LatestInvoices.ItemID = [Food items].ID
ORDER BY [Food items].Item;

Grazie a tutti voi che avete dedicato del tempo per aiutarmi in questo!


2
DISTINCTrestituisce righe distinte tra tutte le colonne della riga, non singole colonne.
Max Vernon,

2
Solo un consiglio: evita di usare spazi nei nomi di tabelle e colonne. Quindi non dovrai circondare tutto con [e]
Max Vernon,

1
Ed è (probabilmente) meglio includere il nome della tabella in tutte le IDcolonne, così diventa IDnella Invoicestabella InvoiceID.
Max Vernon,

Oh, questo ha senso - pensavo che DISTINCTfosse per colonne singole. Esiste un operatore analogo che selezionerà solo in base all'unicità in una singola colonna? Inoltre, grazie per i suggerimenti sulle convenzioni di denominazione - sì, è molto fastidioso doverlo usare [ ... ]ovunque ... E posso vedere come l'inclusione del nome della tabella nella colonna ID aumenterebbe la leggibilità.
J. Taylor,

Risposte:


7

MS Access è piuttosto limitato.

Presumo che sia possibile avere più di una fattura per la stessa data. In questo caso sceglierò una fattura con l'ID più alto.

All'inizio troveremo la data di fatturazione massima per ciascun articolo alimentare.

SELECT
    FPD1.[Food item ID] AS ItemID
    ,MAX(I1.[Invoice Date]) AS MaxDate
FROM
    [Food purchase data] AS FPD1
    INNER JOIN Invoices AS I1 ON I1.ID = FPD1.[Invoice ID]
GROUP BY
    FPD1.[Food item ID]

Poiché è possibile che vi siano più fatture per la data massima trovata, selezioneremo una fattura con l'ID massimo per articolo

Basato sulla sintassi MS Access dei join nidificati e utilizzando questo esempio dai documenti:

SELECT fields 
FROM 
  table1 INNER JOIN 
  (
      table2 INNER JOIN 
      (
          table3 INNER JOIN tablex ON table3.field3 = tablex.fieldx
      ) ON table2.field2 = table3.field3
  ) ON table1.field1 = table2.field2
;

Proviamo a metterlo insieme:

SELECT
    InvoicesMaxDate.ItemID
    ,InvoicesMaxDate.MaxDate
    ,MAX(I2.ID) AS MaxInvoiceID
FROM
    (
        SELECT
            FPD1.[Food item ID] AS ItemID
            ,MAX(I1.[Invoice Date]) AS MaxDate
        FROM
            [Food purchase data] AS FPD1
            INNER JOIN Invoices AS I1 ON I1.ID = FPD1.[Invoice ID]
        GROUP BY
            FPD1.[Food item ID]
    ) AS InvoicesMaxDate INNER JOIN
    (
        [Food purchase data] AS FPD2 
        INNER JOIN Invoices AS I2 ON I2.ID = FPD2.[Invoice ID]
    ) ON
        InvoicesMaxDate.ItemID = FPD2.[Food item ID] AND
        --- you may need to put extra "ON" here as well, not sure
        InvoicesMaxDate.MaxDate = I2.[Invoice Date]
GROUP BY
    InvoicesMaxDate.ItemID
    ,InvoicesMaxDate.MaxDate

Ora abbiamo sia ItemID che ID dell'ultima fattura per quell'articolo. Unisciti a questo nelle tabelle originali per recuperare altri dettagli (colonne).

SELECT
    FI3.Item
    ,FI3.Item
    ,FPD3.[Price per unit]
    ,FPD3.[Purchase unit]
    ,I3.[Invoice Date]
FROM
    (
        SELECT
            InvoicesMaxDate.ItemID
            ,InvoicesMaxDate.MaxDate
            ,MAX(I2.ID) AS MaxInvoiceID
        FROM
            (
                SELECT
                    FPD1.[Food item ID] AS ItemID
                    ,MAX(I1.[Invoice Date]) AS MaxDate
                FROM
                    [Food purchase data] AS FPD1
                    INNER JOIN Invoices AS I1 ON I1.ID = FPD1.[Invoice ID]
                GROUP BY
                    FPD1.[Food item ID]
            ) AS InvoicesMaxDate INNER JOIN
            (
                [Food purchase data] AS FPD2 
                INNER JOIN Invoices AS I2 ON I2.ID = FPD2.[Invoice ID]
            ) ON
                InvoicesMaxDate.ItemID = FPD2.[Food item ID] AND
                InvoicesMaxDate.MaxDate = I2.[Invoice Date]
        GROUP BY
            InvoicesMaxDate.ItemID
            ,InvoicesMaxDate.MaxDate
    ) AS LastInvoices INNER JOIN
    (
        [Food items] AS FI3 INNER JOIN
        (
            [Food purchase data] AS FPD3
            INNER JOIN Invoices AS I3 ON I3.ID = FPD3.[Invoice ID]
        ) ON FI3.ID = FDP3.[Food item ID]
    ) ON
        LastInvoices.MaxInvoiceID = I3.ID AND
        LastInvoices.ItemID = FI3.ID

In pratica, creerei una vista per la prima query con un singolo join. Quindi creerei una seconda vista che unisce la prima vista con le tabelle, quindi la terza vista e così via, per evitare i join nidificati o minimizzarli. La query generale sarebbe più facile da leggere.


Modifica per chiarire cosa intendo in base alla tua soluzione finale che hai inserito nella domanda.

Un ultimo tentativo di trasmettere il mio messaggio.

Questo è quello che hai scritto sulla base dei miei suggerimenti sopra:

SELECT
    InvoicesMaxDate.ItemID
    ,InvoicesMaxDate.MaxDate
    ,Invoices.[Invoice ID]
FROM [Food purchase data], Invoices, 
    (
        SELECT 
            [Food purchase data].[Food item ID] AS ItemID
            ,MAX(Invoices.[Invoice Date]) AS MaxDate
        FROM [Food purchase data], Invoices
        WHERE Invoices.[Invoice ID] = [Food purchase data].[Invoice ID]
        GROUP BY [Food purchase data].[Food item ID]
    )  AS InvoicesMaxDate
WHERE
    Invoices.[Invoice ID] = [Food purchase data].[Invoice ID] AND
    InvoicesMaxDate.ItemID = [Food purchase data].[Food item ID] AND 
    InvoicesMaxDate.MaxDate = Invoices.[Invoice Date]
GROUP BY InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate, Invoices.[Invoice ID];

Questo è ciò che intendevo:

SELECT
    InvoicesMaxDate.ItemID
    ,InvoicesMaxDate.MaxDate
    ,MAX(Invoices.[Invoice ID]) AS [Invoice ID]
FROM [Food purchase data], Invoices, 
    (
        SELECT
            [Food purchase data].[Food item ID] AS ItemID
            ,MAX(Invoices.[Invoice Date]) AS MaxDate
        FROM [Food purchase data], Invoices
        WHERE Invoices.[Invoice ID] = [Food purchase data].[Invoice ID]
        GROUP BY [Food purchase data].[Food item ID]
    )  AS InvoicesMaxDate
WHERE
    Invoices.[Invoice ID] = [Food purchase data].[Invoice ID] AND
    InvoicesMaxDate.ItemID = [Food purchase data].[Food item ID] AND 
    InvoicesMaxDate.MaxDate = Invoices.[Invoice Date]
GROUP BY InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate;

Vedi la differenza?

Il InvoicesMaxDaterestituisce MAX Invoice Dateper ogni Food item ID. Se ci sono due fatture per lo stesso Food item IDcon lo stesso MAX Invoice Date, dovremmo scegliere una fattura tra di loro. Questo viene fatto raggruppando per InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate. Non ci dovrebbe essere alcun raggruppamento Invoices.[Invoice ID]qui, perché vogliamo scegliere la fattura con l'ID massimo.

Una volta che questa query è stata salvata come LatestInvoicesvista, viene utilizzata ulteriormente quando hai scritto correttamente (nota che la query finale utilizza LatestInvoices.[Invoice ID]e LatestInvoices.ItemID, ma non utilizza LatestInvoices.MaxDate):

SELECT 
    [Food items].ID as FoodItemID
    ,[Food items].Item as FoodItem
    ,[Food purchase data].[Price]
    ,[Food purchase data].[Price per unit]
    ,[Food purchase data].[Purchase unit]
    ,Invoices.[Invoice Date]
FROM [Food items], [Food purchase data], Invoices, LatestInvoices
WHERE 
    Invoices.[Invoice ID] = [Food purchase data].[Invoice ID] AND
    [Food items].ID = [Food purchase data].[Food item ID] AND
    LatestInvoices.[Invoice ID] = Invoices.[Invoice ID] AND 
    LatestInvoices.ItemID = [Food items].ID
ORDER BY [Food items].Item

Per quanto riguarda, perché l'ultima query nella domanda restituisce più righe per articolo:

SELECT 
    [Food purchase data].[Food item ID]
    , [Food purchase data].[Price per unit]
    , max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM [Food purchase data], Invoices
GROUP BY [Food purchase data].[Food item ID], [Food purchase data].[Price per unit];

Stai raggruppando qui per [Food item ID]e [Price per unit], quindi otterrai tante righe quante sono le combinazioni uniche di queste due colonne.

La query seguente restituisce una riga per [Food item ID].

SELECT 
    [Food purchase data].[Food item ID]
    , max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM [Food purchase data], Invoices
GROUP BY [Food purchase data].[Food item ID];

Una nota a margine, dovresti davvero usare esplicito INNER JOINinvece di ,. Questa sintassi ha 20 anni.

SELECT 
    [Food purchase data].[Food item ID]
    , max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM
    [Food purchase data]
    INNER JOIN Invoices ON Invoices.ID = [Food purchase data].[Invoice ID]
GROUP BY [Food purchase data].[Food item ID];

Grazie per la tua risposta molto dettagliata! La prima query che hai condiviso ha funzionato e ha effettivamente tirato la data della fattura più recente per ogni singolo prodotto alimentare, il che è davvero utile. Tuttavia, quando ho provato le successive 2 query che hai condiviso, ho avuto "Syntax error (missing operator) in query expression"l'espressione INNER JOIN Invoices AS I2 ON I2.ID = FPD2.[Invoice ID]... Ci giocherò di più per vedere se riesco a farlo funzionare.
J. Taylor,

@JesseTaylor, a quanto pare, è necessario inserire esplicitamente parentesi quadre (e )quando la query utilizza diversi join e spostare la ONclausola un po '. Non ho accesso per controllare, ma posso provare a indovinare la sintassi corretta leggendo i documenti più tardi oggi.
Vladimir Baranov,

@JesseTaylor, ho aggiornato la risposta e spero di indovinare correttamente la sintassi. Per favore provalo e fammi sapere se funziona.
Vladimir Baranov il

1
@JesseTaylor, prego. È da un po 'che non uso Access ed è difficile ottenere la sintassi corretta. Una nota sul tuo punto di vista LatestInvoices: la finale GROUPdovrebbe essere BY InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDateunica, senza Invoices.[Invoice ID]. Nella SELECTparte ci dovrebbe essere MAX(Invoices.[Invoice ID]) AS [Invoice ID]. Questo è il punto. Inizialmente (nella query interna) troviamo GROUP BY [Food item ID]e troviamo la data di fatturazione massima. Ci possono essere diverse fatture con questa data, quindi c'è un secondo GROUP BYper scegliere la fattura con ID massimo tra di loro.
Vladimir Baranov,

1
@JesseTaylor, Sfortunatamente, mi hai frainteso. Ho aggiornato la mia risposta per mostrarti cosa intendevo dire. Per vedere la differenza aggiungi due fatture ai tuoi (campioni) dati per lo stesso ItemIDcon la stessa data di grandi dimensioni e prova entrambe le query.
Vladimir Baranov,

3

Una query che funziona immediatamente:

SELECT Fi.Item, Fpd.[Price per unit], Fpd.[Purchase unit]
FROM [Food items] Fi INNER JOIN [Food purchase data] Fpd
ON Fpd.[Food item ID] = Fi.ID
WHERE Fpd.[Invoice ID] = (
  SELECT TOP 1 I.ID 
  FROM Invoices I INNER JOIN [Food purchase data] Fpd2
  ON Fpd2.[Invoice ID] = I.ID
  WHERE Fpd2.[Food item ID] = Fpd.[Food item ID]
  ORDER BY I.[Invoice Date] DESC
)

Quando eseguo questa query, ricevo solo un errore: "Al massimo un record può essere restituito da questa subquery". La vista del foglio dati mostra solo un record con "#NOME?" in ogni campo.
J. Taylor,

3

Potrei risolverlo con la seguente query:

Select MAX(AllItemBuyings.[invoice date]) as RecentBuyingDate, AllItemBuyings.[Food Item Id]  From 
(    
    select fpd.[Invoice Id], fpd.[Food Item Id], I.[invoice date] From [Food purchase data]as fpd 
    inner join invoices I on fpd.[Invoice Id] = I.ID

) as AllItemBuyings    
Group By AllItemBuyings.[Food Item Id]

Perché non ho accesso ho provato questo su SQL Server. Spero che questo funzioni per te.

Modifica / Query aggiuntiva : per aggiungere le altre colonne della tabella dei prodotti alimentari ho modificato la query. L'ho fatto in un modo che non mi piace molto. Se va bene per te dipende dai tuoi dati e requisiti. Ho aderito nuovamente alla tabella FATTURE utilizzando la Data ordine. Nel caso in cui sia una data compresa l'ora in cui il mio allenamento, ti preghiamo di esserne consapevole. Non vedo un altro modo nel tuo scenario. Forse esiste una soluzione migliore utilizzando la query ricorsiva ...?

Per favore, provalo e fammi sapere se funziona:

Select Recents.RecentBuyingDate, pd.* From 
(

   Select MAX(AllItemBuyings.[invoice date]) as RecentBuyingDate, AllItemBuyings.[Food Item Id]    From 
    (    
        select fpd.[Invoice Id], fpd.[Food Item Id], I.[invoice date], fpd.ID From [Food purchase data]as fpd 
        inner join invoices I on fpd.[Invoice Id] = I.ID

    ) as AllItemBuyings    
    Group By AllItemBuyings.[Food Item Id]

    ) as Recents    
    Join Invoices i on i.[invoice date] = Recents.RecentBuyingDate
    Join [Food purchase data] pd ON pd.[Invoice Id] = i.ID AND pd.[Food Item Id] = Recents.[Food Item Id]

Grazie. Questo mi dà correttamente la data di acquisto più recente per ogni articolo. Come potrei utilizzare questo, però, a tirare in tutti i campi che ho citato nella questione (ad esempio Item, Price per unitecc)?
J. Taylor,

La nuova query che hai suggerito genera solo un messaggio di errore che non dice altro che "Errore di sintassi nella clausola FROM".
J. Taylor,

Forse Access richiede che l'operazione JOIN sia esattamente "INNER JOIN". Prova INNSER JOIN invece di JOIN.
Magier,

2

Credo che il seguito dovrebbe funzionare.

SELECT fi.[Item], fd.[Price per unit], MAX(i.[Invoice Date])
FROM [Invoices] AS i
INNER JOIN [Food Purchase Data] AS fd
    ON i.ID = fd.[Invoice ID]
INNER JOIN [Food items] AS fi
    ON fd.[Food item ID] = fi.ID
GROUP BY fi.Item, fd.[Price per unit]
ORDER BY i.[Invoice Date] DESC

Per quanto riguarda il motivo per cui la tua query non sta restituendo i risultati che desideri:

SELECT [Food purchase data].[Food item ID], [Food purchase data].[Price per unit], max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM [Food purchase data], Invoices
GROUP BY [Food purchase data].[Food item ID], [Food purchase data].[Price per unit];

Il problema più grande che vedo è che non stai davvero facendo nulla per unirti ai tuoi tavoli. Il "join" implicito presente semplicemente elencando entrambi nella clausola FROM ti dà un prodotto cartesiano. Fondamentalmente restituirà ogni possibile combinazione nel tuo database per i campi che stai interrogando.

Ad esempio, se le due tabelle avevano 3 record ciascuna invece di restituire la data più recente, la query restituirebbe qualcosa del tipo: 1,1 1,2 1,3 2,1 2,2 2,3 3,1 3,2 3 , 3

È molto importante che tu dichiari esplicitamente i tuoi iscritti. Due modi per farlo nella tua query sarebbero:

FROM [Food purchase data] AS fd, [Invoices] AS i
WHERE fd.[Invoice ID] = i.[ID]

O

FROM [Food purchase data] AS fd
INNER JOIN [Invoices] AS i
    ON fd.[Invoice ID] = i.[ID]

Query aggiornate, se quelle non funzionano ancora, provare a rimuovere gli alias e utilizzare i nomi di colonna completi.



0

Sono d'accordo con i suggerimenti di Max sul tuo modello di dati. L'implementazione di questi renderà il tuo SQL più leggibile nel lungo periodo.

Detto questo, DISTINCT mostrerà righe uniche. Quindi, per mostrare solo i più recenti, è necessario limitare le colonne visualizzate.

Prova qualcosa del tipo:

SELECT [Food purchase data].[Food item ID], max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM Invoices 
INNER JOIN ([Food items] ON [Food items].ID = [Food purchase data].[Food item ID]) 
GROUP BY [Food purchase data].[Food item ID]

(Traduzione: per ogni articolo nel negozio, visualizza la data della fattura più recente.)

Puoi salvarlo come vista e usarlo in un'altra query come faresti con una tabella. Quindi puoi fare un join interno sulla fattura per il prezzo di acquisto e unire sugli altri tavoli se hai bisogno di quei dettagli.

(Teoricamente, potresti anche eseguire una query nidificata, ma poiché hai richiesto una semplice, una query salvata è più semplice.)

AGGIORNAMENTO basato sull'aggiornamento:

Userò le clausole WHERE anziché JOINS perché non ho MS Access a portata di mano. Dovresti essere in grado di utilizzare la GUI per effettuare le connessioni tra le tabelle in MS Access in base a queste informazioni. (Fornisci un SQLFiddle se hai davvero bisogno di aiuto per ulteriori risoluzione dei problemi.)

Passaggio 1: salvarlo come VISTA (ad esempio "MostRecentInvoice")

SELECT [Food purchase data].[Food item ID] AS FoodItemID, max(Invoices.[Invoice Date]) AS MostRecentInvoiceDate
FROM [Food purchase data], Invoices
WHERE [Food purchase data].[Food item ID] = Invoices.ID
GROUP BY [Food purchase data].[Food item ID];

Passaggio 2: utilizzare la vista in una seconda query

SELECT (list all the fields you need here)
FROM MostRecentInvoice, Invoices, etc...
WHERE MostRecentInvoice.FoodItemID = [Food purchase data].[Food item ID] 
AND MostRecentInvoice.MostRecentInvoiceDate = Invoices.[Invoice Date]
AND (whatever else joins you'll need for the other tables)

... e per rispondere alla tua domanda: la seconda query nell'aggiornamento non funziona perché la colonna [Prezzo per unità] si trova nelle istruzioni SELECT e GROUP BY. Ciò significa essenzialmente che stai chiedendo di vedere TUTTI i possibili valori di [Prezzo per unità] anche se quello che vuoi davvero è solo uno: il valore più recente.


Grazie, ma quando provo a eseguire la query che hai condiviso ottengo un errore: "Errore di sintassi nell'operazione JOIN".
J. Taylor,

Spiacenti, non ho avuto il tempo di creare personalmente le tabelle in Access. Ho pensato che avessi avuto un po 'di esperienze con i join, dato che ce n'erano alcuni nella tua domanda. Hai provato a crearlo facendo Crea -> Query in Access?
Chabzjo,

La prima query che hai condiviso non fornisce risultati corretti a causa della riga WHERE [Food purchase data].[Food item ID] = Invoices.ID... Presumo che intendessi, WHERE [Food purchase data].[Invoice ID] = Invoices.[Invoice ID]ma che restituisca comunque più date per prodotto alimentare anziché solo la più recente.
J. Taylor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.