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:
Pemahaman saya tentang SQL sangat mendasar, dan saya mencoba kueri (salah) berikut, dengan harapan akan mengembalikan hanya satu catatan per item (karena DISTINCT
operator) 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 DISTINCT
operator? 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 BY
klausa:
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!
[
dan]
ID
kolom, sehingga ID
dalam Invoices
tabel menjadi InvoiceID
.
DISTINCT
itu 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.
DISTINCT
mengembalikan baris yang berbeda di semua kolom di baris, bukan kolom tunggal.