2017-05-05 54 views
0

在此先感謝您的幫助!使用最近的日期在兩個表格中找到不同的值

我有兩個表格,標題和細節,我需要合併並選擇項目的最新收據。編寫查詢來完成此任務的最佳方法是什麼?

頭表數據:

HEADER_PO_NUM HEADER_VENDOR_NAME HEADER_ORDER_DATE 
1    VENDOR A   1/1/2017 
2    VENDOR A   2/1/2017 
3    VENDOR B   1/15/2017 
4    VENDOR B   2/15/2017 
5    VENDOR C   1/25/2017 
6    VENDOR C   2/25/2017 

詳細數據表格:

DETAIL_PO_NUM DETAIL_ITEM_NUM DETAIL_ITEM_DESC DETAIL_PURCH_QTY DETAIL_RECD_QTY DETAIL_RECD_DATE 
1    ABC    Bobbles    100    100    3/1/2017 
2    ABC    Bobbles    300    300    3/15/2017 
1    DEF    Knick Knacks  500    500    3/1/2017 
2    DEF    Knick Knacks  5402    5402    3/15/2017 
3    GHI    Doo Dads   392    392    3/1/2017 
4    GHI    Doo Dads   3     3     3/15/2017 
3    JKL    Hoozits    939    939    3/1/2017 
4    JKL    Hoozits    31    31    3/15/2017 
5    MNO    Whatsitz   392    392    4/1/2017 
6    MNO    Whatsitz   294    294    4/25/2017 
5    PQR    Dinglehopper  32    32    4/1/2017 
6    PRQ    Dinglehopper  293    293    4/25/2017 

這就是我想實現:

DETAIL_PO_NUM DETAIL_ITEM_NUM DETAIL_ITEM_DESC DETAIL_PURCH_QTY DETAIL_RECD_QTY DETAIL_RECD_DATE  HEADER_VENDOR_NAME 
2    ABC    Bobbles    300    300    3/15/2017   VENDOR A 
2    DEF    Knick Knacks  5402    5402    3/15/2017   VENDOR A 
4    GHI    Doo Dads   3     3     3/15/2017   VENDOR B 
4    JKL    Hoozits    31    31    3/15/2017   VENDOR B 
6    MNO    Whatsitz   294    294    4/25/2017   VENDOR C 
6    PRQ    Dinglehopper  293    293    4/25/2017   VENDOR C 

我能夠把它縮小通過DETAIL_ITEM_NUMDETAIL_RECD_DATE,但不能包括其他列使用以下ING訪問SQL查詢:

SELECT 
    DISTINCT DETAIL.DETAIL_ITEM_NUM, 
    Max(DETAIL.DETAIL_RECD_DATE) AS MaxOfDETAIL_RECD_DATE 
FROM HEADER 
INNER JOIN 
    DETAIL ON HEADER.HEADER_PO_NUM = DETAIL.DETAIL_PO_NUM 
GROUP BY DETAIL.DETAIL_ITEM_NUM; 

我已搜查,審查,並嘗試了幾種答案(過去數天),但似乎無法讓他們工作。

我感謝您的時間和幫助。

回答

1

讓我們先從細節表中獲取最近的訂單。如果這就是你要找的東西,那麼請在回答開頭的計數器旁邊的左邊選擇它,將其標記爲正確。如果這不是你正在尋找的東西,那麼請添加一個有更多要求的評論。 我們將使用兩次細節表,分別命名爲a和b。

現在我們可以忘記與頭表的連接,並專注於詳細表。我們將主要處理兩個可以多次具有相同值的item_num列和recd_date列,它記錄日期並假定每個ite_num組具有唯一的日期。

假設我們在變量abc中有一個item_num值,例如值爲「ABC」(請參見細節表中的第1行和第2行)。

我們可以通過按照記錄日期降序排列,從具有此item_num「ABC」的所有行中精確選擇一行來選擇最近的行。

SELECT TOP 1 d.* 
FROM detail AS d 
WHERE d.detail_item_num = "ABC" -- or some variable's value like abc in general 
ORDER BY d.detail_recd_date DESC -- most recent row please 

現在我們將它應用於詳細表中的所有行。對於每一行,使用當前行的組標識列detail_item_num查找內部SELECT查詢中組的所有行,然後獲取最近的一行。或者換句話說,對於每一行,通過檢查該當前行的a.detail_po_num是否與該組中最近行的有效唯一b.detail_po_num相同來決定它是否應出現在結果中。 這應該給你一組最近的行,每組一個。

SELECT a.* 
FROM detail AS a 
WHERE a.detail_po_num = ( -- if = does not work, go with IN 
    SELECT TOP 1 detail_po_num -- this should allow =, but use IN in general (for TOP 3, i.e.) 
    FROM detail AS b 
    WHERE a.detail_item_num = b.detail_item_num -- rows in same group only 
    ORDER BY b.detail_recd_date DESC, b.detail_po_num DESC -- po_num tie breaker 
); 

通過有效獨一無二的,我的意思是我的假設,詳細列(detail_item_num,detail_recd_date,detail_po_num)的組合是唯一的。 如果假定日期對於由相同值item_num標識的每個組都是唯一的,則(detail_item_num,detail_po_num)也可以是UNIQUE。

ORDER BY子句的第二部分用作決定因子,只有在並非所有recd_date都是唯一的情況下才會激發。如果您沒有聯繫斷路器,那麼DBMS可以在不同時間自由返回同一查詢的不同結果。在這種情況下,第二部分b.detail_item_num DESC傾向於最高的po_num

如果這樣可行,那麼你現在就可以加入,就像你上面做的那樣。只需使用給定的名稱a,它已被賦予外部細節表。

哦,並且可能在查詢中存在拼寫錯誤,因爲我沒有安裝MS Access並在不讓它運行的情況下編寫它。除此之外,我不想將您的數據轉化爲CREATEINSERT報表。所以,查詢未被選中。

+0

查詢中的拼寫錯誤:detail_po_num是tie tie斷開器,而不是detail_item_num,它是相同的xD – flutter

+0

您是否知道將答案標記爲正確並且表明它是兩回事?檢查點旁邊的標記以接受答案不僅給我,還有你點?來吧,給我那些多汁點 - 花了很長時間寫出這樣一個詳細的解釋。 – flutter

+0

謝謝你撲! –

相關問題