重做此问题,希望避免声望进一步降低-抱歉!
我正在使用我在工作中创建的关系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说我没有提供足够的信息是正确的。我希望这有助于澄清问题。
答案 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
。