仅当存在最大值时,有没有办法从SQL / Access中的字段返回值?

时间:2019-07-08 16:57:25

标签: sql database ms-access relational-database

重做此问题,希望避免声望进一步降低-抱歉!

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

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

Ref ID      Customer Name   AR

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

如您所见,一个RefID上有多个客户名称。我一直在旋转轮子,试图在AR字段上使用总和并获取“最大值”。不幸的是,每次我尝试将其拉到新表中时,两个“客户名称”都会同时出现。当前使用的代码示例:

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

此代码当前提取所有RefId和MCA或最大回收量。但是,如果我尝试从映射表中输入客户名称:

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活动最多的客户名称。为了使之成为可能,所有必需的数据都位于AR数据文件中-这是我们基于RefID的AR活动的数据转储。我还有一个名为“客户映射表”的表,在其中与一些客户创建了父子关系。对于任何可行的解决方案,我将需要查询AR表,提取每个客户的最大AR值,并将每个RefID隔离到映射表中仅一个父名称。

编辑:尝试以最小的可复制示例

我的数据的主要来源是AR表-在本练习中,字段如下:

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中的表格,称为“ 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);

当我点击“运行”时,没有错误代码出现,但是查询返回以下内容:

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的每一个都将显示在两个唯一的行中,并且仅包含max AR,Customer Name和itemdesc字段。我担心这是我的错,Philipxy说我没有提供足够的信息是正确的。我希望这有助于澄清问题。

1 个答案:

答案 0 :(得分:2)

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

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