有没有办法仅在存在最大值时从 SQL/Access 中的字段 return 获取值?

Is there a way to return a value from a field in SQL/Access only when the max value is present?

重做这个问题,希望能避免声誉进一步下降——很抱歉是新手!

我正在处理我在工作中创建的关系型 MS-Access 数据库。我是自学成才的,所以非常感谢您的帮助!

我目前面临的问题是我需要为每笔独立交易 (RefID) 设置 1 个客户名称。不幸的是,我们使用的系统将允许多个客户名称存在于一个 RefID 上。例如(摘自我正在使用的 AR 数据 Table):

Ref ID      Customer Name   AR

20164444    Liberty         50
20164444    Liberty         75
20164444    Unicorn         100
20164444    Liberty         2500

如您所见,一个 RefID 上有多个客户名称。我一直在旋转我的轮子,试图在 AR 场上使用总和并检索最大值。不幸的是,每次我尝试将其拉入新的 table 时,两个客户名称都会出现。当前使用的代码示例:

SELECT AR.Refid, max(AR.collectamount) as MCA
FROM AR
GROUP by AR.RefID

此代码当前正在提取所有 RefId 和 MCA 或最大收款金额。但是,如果我尝试从我的映射 table:

中引入客户名称
SELECT AR.Refid, Max(AR.collectamount) AS MCA, [Customer Mapping Table].[Parent Name]
FROM AR INNER JOIN [Customer Mapping Table] ON AR.chkrcvdfrom = [Customer Mapping Table].[Child Name - IE]
GROUP BY AR.Refid, [Customer Mapping Table].[Parent Name];

不幸的是,这段代码使我的记录达到了 147,977 条,我已经确定我应该只有 145,395 条唯一记录。这表明 RefID 上存在重复项。请查看以下我发现失败的交易示例:

Ref ID        Customer Name     AR

20161100749   TBC               2517
20161100749   Unicorn           30

归根结底,我需要所有 145,395 个 RefID 只有一个客户名称。如果有两个客户,我需要具有最多 AR activity 的客户名称。使这成为可能所需的所有数据都位于 AR 数据文件中——我们的 AR activity 基于每个 RefID 的数据转储。我还有一个名为 "Customer Mapping Table" 的额外 table,我在其中与我们的一些客户建立了亲子关系。对于任何有效的解决方案,我都需要查询 AR Table,提取每个客户的最大 AR 值,并将每个 RefID 隔离到映射 table 中的一个父名称。

编辑:尝试最小化、可重现的示例

我数据的主要来源是 AR Table -- 出于本练习的目的,字段如下:

Ref ID        Customer Name     CollectAmount    itemdesc

20161100749   TBC               2517             Ocean_Freight
20161100749   Unicorn           30               Insurance_Premium
20161100749   TBC               30               AMS Fee
20161100749   TBC               100              Pre-Pull
20161100749   TBC               225              Trucker Yard Storage
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          125              Handling Charge
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY

上面的部分可以复制并粘贴为 MS-Access 中的 table 并称为 "AR" -- 这将反映我正在使用的 MS-Access 环境。

我拿了Lee的代码实现如下:

SELECT t1.*
FROM AR AS t1 INNER JOIN 
(select t.refid, max(t.collectamount) as MCA
GROUP by AR.RefID)
As t2 ON (t1.collectamount = t2.mca) AND (t1.refid = t2.refid);

当我点击 "Run" 时没有出现错误代码,但是查询 returns 如下:

Ref ID        Customer Name     CollectAmount    itemdesc

20161100749   TBC               2517             Ocean_Freight
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY
50180900002   Westlake          170              LOCAL_CARTAGE_DELIVERY

数据的最终目标是我提供的两个 RefID 中的每一个都将显示在两个唯一的行中,只有最大 AR、客户名称和 itemdesc 字段。我担心这是我的错,Philipxy 是对的,我没有提供足够的信息。我希望这有助于澄清问题。

如果您要获取与具有相同 RefID 的所有记录中保持最大 CollectAmount 值的记录关联的信息,则一种可能的方法是使用联接:

select t1.*
from YourTable t1 inner join
(
    select t.refid, max(t.collectamount) as mca
    from YourTable t 
    group by t.refid
) t2
on t1.refid = t2.refid and t1.collectamount = t2.mca

或者,使用相关子查询:

select t1.* from YourTable t1 where t1.collectamount = 
(select max(t2.collectamount) from YourTable t2 where t1.refid = t2.refid)

在这里,将出现的每个 YourTable 更改为您 table 的名称。