使用最近的日期在两个表中查找不同的值

时间:2017-05-05 22:38:17

标签: sql ms-access

提前感谢您的帮助!

我有两个表,标题和详细信息,我需要在其中组合并选择项目的最新收据。编写查询来实现此目的的最佳方法是什么?

标题表数据:

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

我已经搜索,审核并尝试了几个答案(过去几天),但似乎无法让它们发挥作用。

感谢您的时间和帮助。

1 个答案:

答案 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并在不让它运行的情况下编写了这个。此外,我不想将您的数据形成CREATEINSERT语句。因此,查询未经检查。