提前感谢您的帮助!
我有两个表,标题和详细信息,我需要在其中组合并选择项目的最新收据。编写查询来实现此目的的最佳方法是什么?
标题表数据:
object
详细表格数据:
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_NUM
缩小范围,但无法使用以下Access SQL查询包含其他列:
DETAIL_RECD_DATE
我已经搜索,审核并尝试了几个答案(过去几天),但似乎无法让它们发挥作用。
感谢您的时间和帮助。
答案 0 :(得分: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)的组合是UNIQUE。 如果您假设日期对于由相同值item_num标识的每个组都是唯一的,则(detail_item_num,detail_po_num)也可以是唯一的。
ORDER BY
子句的第二部分用作打破平局,只有在并非所有recd_date
都是唯一的情况下才会触发。如果您没有平局,则DBMS可以在不同时间为同一查询返回不同的结果。在这种情况下,第二部分b.detail_item_num DESC
倾向于最高po_num
。
如果这样可行,那么您现在可以加入,就像您上面所做的那样。只需使用给定名称a
,该名称已提供给外部详细信息表。
哦,查询中可能存在拼写错误,因为我没有安装MS Access并在不让它运行的情况下编写了这个。此外,我不想将您的数据形成CREATE
和INSERT
语句。因此,查询未经检查。