我正在努力弄清楚這一點......我錯過了什么?
我有 3 個相互連接的表:
發票具有“id”和“輸入日期”發票專案具有連接到“發票”的“id”和連接到“產品”的產品產品具有連接到“發票專案”的“產品代碼”
我需要選擇庫存中所有產品的最后入庫日期
我的選擇如下所示:
SELECT Max(ENTRY)
, PRODUCT
, NAME
FROM (
SELECT TO_DATE(NT.ENTRY, 'dd/mm/yyyy') "ENTRY"
, NT.INVOICE_ID "INVOICE"
, NTI.PRODUCT "PRODUCT"
, P.NAME "NAME"
FROM INVOICE NT
INNER JOIN INVOICE_ITEM NTI ON NTI.INVOICE_ID = NT.INVOICE_ID
INNER JOIN PRODUCTS P ON P.COD = NTI.PRODUCT
ORDER BY ENTRY ASC)
GROUP BY PRODUCT, NAME
結果很好:
MAX(ENTRY) PRODUCT NAME
03/11/021 00:00:00 3 AGULHA
03/11/021 00:00:00 11 MOUSE
30/04/021 00:00:00 8 LUVAS DESCARTAVEIS
20/11/019 00:00:00 6 FLAGYL
30/04/020 00:00:00 4 DORFLEX
30/04/022 00:00:00 1 CABO 25MM
05/04/020 00:00:00 7 MASCARA PFF2
20/02/020 00:00:00 2 SERINGA
現在我應該添加連接到“最大條目”的 Invoice_ID 列
如果我在頂部選擇中添加 NT.INVOICE_ID,則會出現一個錯誤,提示我應該在“group by”函式中包含“INVOICE_ID”。但是如果我在 group by 中添加“INVOICE_ID”,我的選擇會分成比理想結果更多的行。
SELECT Max(ENTRY)
, PRODUCT
, NAME
, INVOICE
FROM (
SELECT TO_DATE(NT.ENTRY, 'dd/mm/yyyy') "ENTRY"
, NT.INVOICE_ID "INVOICE"
, NTI.PRODUCT "PRODUCT"
, P.NAME "NAME"
FROM INVOICE NT
INNER JOIN INVOICE_ITEM NTI ON NTI.INVOICE_ID = NT.INVOICE_ID
INNER JOIN PRODUCTS P ON P.COD = NTI.PRODUCT
ORDER BY ENTRY ASC)
GROUP BY PRODUCT, NAME, INVOICE
結果變成:
MAX(ENTRY) PRODUCT NAME INVOICE
20/11/019 00:00:00 1 CABO 25MM 3264
30/04/015 00:00:00 2 SERINGA 333
03/11/021 00:00:00 11 MOUSE 100
20/02/020 00:00:00 7 MASCARA PFF2 4600
30/04/018 00:00:00 4 DORFLEX 101
30/04/022 00:00:00 1 CABO 25MM 345
03/11/021 00:00:00 3 AGULHA 100
03/11/021 00:00:00 1 CABO 25MM 100
30/04/018 00:00:00 2 SERINGA 101
30/04/015 00:00:00 1 CABO 25MM 333
30/04/020 00:00:00 4 DORFLEX 102
20/11/019 00:00:00 3 AGULHA 3264
20/02/020 00:00:00 2 SERINGA 4600
30/04/021 00:00:00 8 LUVAS DESCARTAVEIS 402
20/11/019 00:00:00 6 FLAGYL 3264
13/07/017 00:00:00 6 FLAGYL 1644
30/04/018 00:00:00 8 LUVAS DESCARTAVEIS 101
30/04/015 00:00:00 2 SERINGA 400
05/04/020 00:00:00 7 MASCARA PFF2 125
12/06/017 00:00:00 3 AGULHA 127
Invoice_ID 應該連接到最后一個條目。MAX(Invoice) 不會顯示正確的選擇,因為發票有幾個低和高的數字。請問有什么辦法可以解決嗎?
uj5u.com熱心網友回復:
您可以在結果和發票之間使用連接
select t1.max_entry, t2.invoice
from (
SELECT Max(ENTRY) max_entry
, PRODUCT
, NAME
FROM (
SELECT TO_DATE(NT.ENTRY, 'dd/mm/yyyy') "ENTRY"
, NT.INVOICE_ID "INVOICE"
, NTI.PRODUCT "PRODUCT"
, P.NAME "NAME"
FROM INVOICE NT
INNER JOIN INVOICE_ITEM NTI ON NTI.INVOICE_ID = NT.INVOICE_ID
INNER JOIN PRODUCTS P ON P.COD = NTI.PRODUCT
ORDER BY ENTRY ASC)
GROUP BY PRODUCT, NAME
) t1
inner join INVOICE t2 on t1.max_entry = t2.entry
uj5u.com熱心網友回復:
雖然 Oracle 提供了它的專有KEEP LAST技術,但這是一項通常使用分析函式(如MAX|ROW_NUMBER|RANK| ... OVER.
SELECT invoice_date, invoice_id, product_code, product_name
FROM
(
SELECT
TO_DATE(nt.entry, 'dd/mm/yyyy') AS invoice_date,
MAX(TO_DATE(nt.entry, 'dd/mm/yyyy')) OVER (PARTITION BY nti.product) AS max_invoice_date_of_product,
nt.invoice_id
nti.product AS product_code,
p.name AS product_name
FROM invoice nt
INNER JOIN invoice_item nti ON nti.invoice_id = nt.invoice_id
INNER JOIN products p ON p.cod = nti.product
)
WHERE invoice_date = max_invoice_date_of_product
ORDER BY product_code;
(您可能知道將日期作為字串存盤在資料庫中是一個壞主意。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376651.html
下一篇:SQL中的兩個條件過濾
