有没有办法仅在存在最大值时从 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 的名称。
重做这个问题,希望能避免声誉进一步下降——很抱歉是新手!
我正在处理我在工作中创建的关系型 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 的名称。