Permintaan SQL untuk hanya menampilkan catatan pembelian terbaru untuk setiap item makanan

8

Saya bekerja dengan sistem pembelian / faktur makanan di MS Access 2013 dan saya mencoba untuk membuat kueri SQL yang akan mengembalikan harga pembelian terbaru untuk setiap item makanan individu.

Berikut adalah diagram dari tabel yang saya kerjakan: Tabel dalam database MS Access

Pemahaman saya tentang SQL sangat mendasar, dan saya mencoba kueri (salah) berikut, dengan harapan akan mengembalikan hanya satu catatan per item (karena DISTINCToperator) dan hanya akan mengembalikan pembelian terakhir (sejak saya melakukan 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;

Namun kueri di atas hanya mengembalikan semua pembelian makanan (yaitu beberapa catatan untuk setiap catatan di [Food items]), dengan hasil diurutkan menurun berdasarkan tanggal. Bisakah seseorang menjelaskan kepada saya apa yang saya salah pahami tentang DISTINCToperator? Artinya, mengapa tidak hanya mengembalikan satu rekaman untuk setiap item [Food items]?

Dan lebih penting lagi - apa cara paling sederhana bagi saya untuk hanya menarik data pembelian makanan terbaru untuk setiap item makanan, mengingat struktur tabel yang ditunjukkan di atas ? Saya tidak terlalu peduli dengan efisiensi dan kesederhanaannya (basis data yang saya kerjakan agak kecil - itu akan bertahun-tahun sebelum bahkan dalam kisaran puluhan ribu catatan). Saya lebih peduli tentang permintaan yang bisa dimengerti untuk seseorang dengan sedikit pengetahuan tentang SQL.

UPDATE: Jadi saya mencoba, kedua jawaban yang disarankan di bawah ini, dan keduanya tidak bekerja (mereka hanya memunculkan kesalahan sintaksis).

Berdasarkan saran di bawah ini, dan bacaan lebih lanjut online, saya menulis permintaan baru berikut, menggunakan fungsi agregat max()dan GROUP BYklausa:

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

Tetapi saya masih memiliki masalah yang sama: yaitu, saya masih melihat lebih dari satu hasil untuk setiap item makanan. Adakah yang bisa menjelaskan mengapa permintaan ini tidak hanya mengembalikan pembelian terakhir untuk setiap item makanan?

PEMBARUAN 2 (ASK!) :

Tidak ada jawaban di bawah ini yang berhasil tetapi berdasarkan modifikasi berat dari jawaban Vladimir di bawah ini , saya dapat membuat pertanyaan berikut, yang tampaknya memberikan hasil yang benar.

Pertama, saya membuat tampilan ini dan menamainya "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

Lalu saya menulis permintaan lain untuk menarik bidang yang saya butuhkan:

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;

Terima kasih kepada Anda semua yang telah meluangkan waktu untuk membantu saya dengan ini!

J. Taylor
sumber
2
DISTINCTmengembalikan baris yang berbeda di semua kolom di baris, bukan kolom tunggal.
Max Vernon
2
Hanya kata nasihat, hindari menggunakan spasi di nama tabel dan kolom Anda. Maka Anda tidak perlu mengelilingi segala sesuatu dengan [dan]
Max Vernon
1
Dan itu (bisa dibilang) yang terbaik untuk memasukkan nama tabel di semua IDkolom, sehingga IDdalam Invoicestabel menjadi InvoiceID.
Max Vernon
Oh, itu masuk akal - saya pikir DISTINCTitu dengan satu kolom. Apakah ada operator analog yang hanya akan memilih berdasarkan keunikan dalam satu kolom? Juga, terima kasih atas tips tentang konvensi penamaan - ya, sangat menjengkelkan harus digunakan di [ ... ]mana-mana ... Dan saya bisa melihat bagaimana memasukkan nama tabel di kolom ID akan meningkatkan keterbacaan.
J. Taylor

Jawaban:

7

Akses MS agak terbatas.

Saya berasumsi bahwa ada kemungkinan untuk memiliki lebih dari satu faktur untuk tanggal yang sama. Dalam hal ini saya akan memilih faktur dengan ID tertinggi.

Pada awalnya kita akan menemukan Tanggal Faktur maksimum untuk setiap Item Makanan.

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]

Karena ada beberapa faktur untuk tanggal maks yang ditemukan, kami akan memilih satu faktur dengan ID maks per Item

Berdasarkan sintaks MS Access dari nested joins dan menggunakan contoh ini dari dokumen:

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
;

Mari kita coba menyatukannya:

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

Sekarang kami memiliki ItemID dan ID dari Faktur terakhir untuk Item itu. Gabung ini ke tabel asli untuk mengambil detail lainnya (kolom).

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

Dalam praktiknya saya akan membuat tampilan untuk permintaan pertama dengan satu bergabung. Lalu saya akan membuat tampilan kedua yang menggabungkan tampilan pertama dengan tabel, lalu tampilan ketiga dan seterusnya, untuk menghindari gabungan yang bersarang atau meminimalkannya. Permintaan keseluruhan akan lebih mudah dibaca.


Edit untuk mengklarifikasi apa yang saya maksud berdasarkan solusi akhir Anda yang Anda masukkan ke pertanyaan.

Upaya terakhir untuk menyampaikan pesan saya.

Ini yang Anda tulis berdasarkan saran saya di atas:

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

Inilah yang saya maksud:

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;

Apakah Anda melihat perbedaannya?

Pengembalian InvoicesMaxDateMAX Invoice Dateuntuk masing-masing Food item ID. Jika ada dua faktur yang sama Food item IDdengan MAX yang sama, Invoice Datekami harus memilih satu faktur di antaranya. Ini dilakukan dengan mengelompokkan berdasarkan InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDate. Seharusnya tidak ada pengelompokan di Invoices.[Invoice ID]sini, karena kami ingin memilih faktur dengan ID maksimum.

Setelah kueri ini disimpan sebagai LatestInvoicestampilan, kueri ini digunakan lebih lanjut saat Anda menulis dengan benar (perhatikan, bahwa kueri akhir menggunakan LatestInvoices.[Invoice ID]dan LatestInvoices.ItemID, tetapi tidak menggunakan 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

Adapun, mengapa permintaan terakhir Anda dalam pertanyaan mengembalikan beberapa baris per Item:

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

Anda mengelompokkan di sini oleh [Food item ID]dan [Price per unit], jadi Anda akan mendapatkan banyak baris karena ada kombinasi unik dari dua kolom ini.

Kueri berikut akan mengembalikan satu baris 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];

Sebuah catatan, Anda benar-benar harus menggunakan eksplisit INNER JOINbukan ,. Sintaksnya berumur 20 tahun.

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];
Vladimir Baranov
sumber
Terima kasih atas jawaban Anda yang sangat terperinci! Kueri pertama yang Anda bagikan berfungsi, dan memang menarik tanggal faktur terbaru untuk setiap item makanan individual, yang sangat membantu. Namun, ketika saya mencoba 2 pertanyaan berikutnya yang Anda bagikan, saya mendapatkan "Syntax error (missing operator) in query expression"ekspresi INNER JOIN Invoices AS I2 ON I2.ID = FPD2.[Invoice ID]... Saya akan bermain-main dengannya lebih banyak untuk melihat apakah saya bisa membuatnya bekerja.
J. Taylor
@ JesseTaylor, tampaknya, perlu untuk secara eksplisit menempatkan tanda kurung (dan )ketika permintaan menggunakan beberapa bergabung dan untuk memindahkan ONklausa sekitar sedikit. Saya tidak memiliki akses untuk memeriksa, tetapi saya dapat mencoba menebak sintaks yang benar dengan membaca dokumen hari ini.
Vladimir Baranov
@ JesseTaylor, saya memperbarui jawabannya dan berharap saya menebak sintaks dengan benar. Silakan coba dan beri tahu saya jika itu berhasil.
Vladimir Baranov
1
@JesseTaylor, sama-sama. Sudah lama sejak saya menggunakan Access dan sulit untuk mendapatkan sintaksnya dengan benar. Satu catatan tentang pandangan Anda LatestInvoices: final GROUPseharusnya BY InvoicesMaxDate.ItemID, InvoicesMaxDate.MaxDatehanya, tanpa Invoices.[Invoice ID]. Pada SELECTbagian itu harus ada MAX(Invoices.[Invoice ID]) AS [Invoice ID]. Ini intinya. Pada awalnya (dalam permintaan dalam) kami GROUP BY [Food item ID]dan menemukan Tanggal Faktur maksimum. Mungkin ada beberapa faktur dengan tanggal ini, jadi ada satu detik GROUP BYuntuk memilih faktur dengan ID maksimum di antara mereka.
Vladimir Baranov
1
@JesseTaylor, Sayangnya, Anda salah paham. Saya memperbarui jawaban saya untuk menunjukkan kepada Anda apa yang saya maksud. Untuk melihat perbedaannya, tambahkan dua faktur ke data (sampel) Anda untuk yang sama ItemIDdengan tanggal besar yang sama dan coba kedua kueri.
Vladimir Baranov
3

Kueri yang hanya berfungsi di luar kotak:

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
)
aksenoff
sumber
Ketika saya menjalankan kueri ini, saya hanya mendapatkan kesalahan: "Paling banyak satu catatan dapat dikembalikan oleh subquery ini." Tampilan lembar data hanya menampilkan satu catatan dengan "#NAME?" di setiap bidang.
J. Taylor
3

Saya bisa menyelesaikannya dengan pertanyaan berikut:

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]

Karena saya tidak memiliki Access, saya menguji ini pada SQL Server. Saya harap ini akan berhasil untuk Anda.

Edit / Permintaan tambahan : Untuk menambahkan kolom lain dari tabel item makanan saya mengubah permintaan. Saya melakukannya dengan cara yang tidak terlalu saya sukai. Jika itu baik untuk Anda tergantung pada data dan persyaratan Anda. Saya bergabung dengan tabel INVOICES lagi dengan menggunakan Tanggal Pesanan. Jika ini adalah tanggal termasuk waktu saya berolahraga, harap perhatikan hal itu. Saya tidak melihat cara lain dalam skenario Anda. Mungkin ada solusi yang lebih baik menggunakan permintaan rekursif ...?

Silakan coba dan beri tahu saya jika berhasil:

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]
Magier
sumber
Terima kasih. Ini dengan benar memberi saya tanggal pembelian terbaru untuk setiap item. Bagaimana saya menggunakan ini, meskipun, untuk tarik di semua bidang yang saya sebutkan dalam pertanyaan (misalnya Item, Price per unit, dll)?
J. Taylor
Kueri baru yang Anda sarankan hanya memunculkan pesan kesalahan yang mengatakan tidak lain dari "Sintaks kesalahan dalam klausa FROM."
J. Taylor
Mungkin Access mengharuskan operasi GABUNG persis "INNER JOIN". Coba INNSER BERGABUNG bukan hanya BERGABUNG.
Magier
2

Saya percaya di bawah ini akan berhasil.

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

Adapun alasan permintaan Anda tidak mengembalikan hasil yang Anda inginkan:

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

Masalah terbesar yang saya lihat adalah Anda tidak benar-benar melakukan apa pun untuk bergabung dengan tabel Anda. "Gabung" implisit yang hadir hanya dengan mencantumkan keduanya dalam klausa FROM Anda memberi Anda produk Cartesian. Pada dasarnya itu akan mengembalikan setiap kemungkinan kombinasi di database Anda untuk bidang yang Anda tanyakan.

Misalnya, jika kedua tabel memiliki masing-masing 3 catatan alih-alih mengembalikan tanggal terbaru, kueri Anda akan mengembalikan sesuatu seperti: 1,1 1,2 1,3 2,1 2,2 2,3 3,1 3,2 3 3

Sangat penting bagi Anda untuk secara eksplisit menyatakan bergabung. Dua cara yang dapat Anda lakukan dalam kueri adalah:

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

ATAU

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

Kueri yang diperbarui, jika itu masih tidak berhasil coba hapus alias dan gunakan nama kolom yang sepenuhnya memenuhi syarat.

agpoweredmg
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
agpoweredmg
0

Saya setuju dengan saran Max tentang model data Anda. Menerapkannya akan membuat SQL Anda lebih mudah dibaca dalam jangka panjang.

Dengan itu, DISTINCT akan menampilkan baris unik. Jadi untuk hanya menampilkan yang terbaru, Anda harus membatasi kolom yang ditampilkan.

Coba sesuatu seperti:

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]

(Terjemahan: Untuk setiap item di toko, tampilkan tanggal faktur terbarunya.)

Anda bisa menyimpan ini sebagai tampilan dan menggunakannya dalam kueri lain seperti halnya sebuah tabel. Jadi, Anda dapat melakukan join batin pada faktur untuk harga pembelian dan bergabung di tabel lain jika Anda membutuhkan detail itu.

(Secara teoritis, Anda juga bisa melakukan kueri bersarang, tetapi karena Anda meminta sederhana, kueri yang disimpan lebih sederhana.)

UPDATE berdasarkan pada pembaruan Anda:

Saya akan menggunakan klausa WHERE daripada GABUNG karena saya tidak memiliki MS Access. Anda harus dapat menggunakan GUI untuk membuat koneksi antara tabel di MS Access berdasarkan informasi ini. (Berikan SQLFiddle jika Anda benar-benar membutuhkan bantuan untuk pemecahan masalah lebih lanjut.)

Langkah 1: Simpan ini sebagai LIHAT (Misalnya, "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];

Langkah 2: Gunakan tampilan dalam kueri ke-2

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)

... dan untuk menjawab pertanyaan Anda: Kueri ke-2 dalam pembaruan tidak berfungsi karena kolom [Harga per unit] ada di pernyataan SELECT dan GROUP BY Anda. Ini pada dasarnya berarti Anda meminta untuk melihat SEMUA nilai yang mungkin dari [Harga per unit] meskipun apa yang benar-benar Anda inginkan hanyalah satu: nilai terbaru.

chabzjo
sumber
Terima kasih, tetapi ketika saya mencoba menjalankan kueri yang Anda bagikan, saya hanya mendapatkan kesalahan: "Sintaks kesalahan dalam operasi BERGABUNG."
J. Taylor
Maaf, saya tidak punya waktu untuk membuat tabel di Access sendiri. Saya berasumsi Anda memiliki sedikit pengalaman dengan bergabung karena ada beberapa dalam pertanyaan Anda. Apakah Anda mencoba membuatnya dengan membuat Buat -> Kueri di Akses?
chabzjo
Kueri pertama yang Anda bagikan tidak memberikan hasil yang benar karena baris WHERE [Food purchase data].[Food item ID] = Invoices.ID... Saya menganggap Anda maksud WHERE [Food purchase data].[Invoice ID] = Invoices.[Invoice ID]tetapi itu masih mengembalikan beberapa tanggal per item makanan, bukan hanya yang terbaru.
J. Taylor