微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

微软访问记录一堆列中最高数字的位置

如何解决微软访问记录一堆列中最高数字的位置

我提前道歉,我刚开始寻求帮助,但我已经为此苦苦挣扎了很长时间。

我有一个 MS Access 表,它在列中存储了大量信息。我需要能够记录最高数字出现在每列、新表或查询中的哪个位置。注意:该表有 40 多列,因此使用“按最大值排序”的单个查询对我不起作用。

表格的简化版本会是这样; 表1

位置 Col1 Col2 Col3 Col4
1 0.1 0.5 0.8 0.3
2 0.5 0.7 0.1 0.5
3 0.7 0.6 0.2 0.7
4 0.2 0.1 0.5 0.8
5 0.3 0.8 0.4 0.2
6 0.6 0.3 0.3 0.4

我需要一个新表或查询来告诉我最高数字的位置? 结果表看起来像这样。其中,Col1 的最高编号位于位置 3,Col2 的最高编号位于位置 5,Col3 的最高编号位于位置 1,依此类推。

Col1R Col2R Col3R Col4R
3 5 1 4

在 VBA、sql查询方面的任何帮助或指导将不胜感激。 (我使用的是 MS Access 2016)

感谢大家及时和出色的回复,我现在已经尝试了您的解决方案,起初它们工作正常,但是当您添加更多数据时,它们返回错误的结果。 我应该提供更多信息来开始,但只是想保持简单。

由于某些原因,我无法编辑表格或正确添加新表格以显示扩展信息。

请看一下新表格信息和结果的 2 张图片,提前谢谢大家。

table 1 info

enter image description here

解决方法

这是一个有趣的答案。用sql server写的,我对access不熟悉,不过我觉得你可以试试同样的方法。

假设您的行数少于 1000。

select 
  max(convert(int,Col1 * 100) * 10000 + Position) % 10000 as Col1R,max(convert(int,Col2 * 100) * 10000 + Position) % 10000 as Col2R,Col3 * 100) * 10000 + Position) % 10000 as Col3R
from T

好的 ms 访问版本。

SELECT
  max (  CInt( Col1 * 100) * 10000 + Position ) mod 10000,max (  CInt( Col2 * 100) * 10000 + Position ) mod 10000,max (  CInt( Col3 * 100) * 10000 + Position ) mod 10000 
FROM T
,

一个选项涉及域聚合函数。

SELECT DISTINCT DLookUp("Position","Table3","Col1=" & DMax("Col1","Table3")) AS C1,DLookUp("Position","Col2=" & DMax("Col2","Table3")) AS C2,"Col3=" & DMax("Col3","Table3")) AS C3,"Col4=" & DMax("Col4","Table3")) AS C4
FROM Table3;

对于相关的嵌套查询,这也可能是可能的,但考虑到它,我的大脑很烦躁。我会让你探索这种可能性。从 Find max value and show corresponding value from different field in MS Access

的评论开始

另一个选项涉及 VBA 自定义函数。它要么使用上面的域聚合表达式,要么打开一个记录集对象。

Function GetMaxPos(strCol As String)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT Position," & strCol & " FROM Table3 ORDER BY " & strCol & " DESC")
GetMaxPos = rs!Position
End Function

从查询或文本框中调用函数。

SELECT DISTINCT GetMaxPos("Col1") AS C1,GetMaxPos("Col2") AS C2,GetMaxPos("Col3") AS C3,GetMaxPos("Col4") AS C4
FROM Table3;

如果有 40 个计算值和大量记录,这些选项中的任何一个都可能执行缓慢。

,

我会在 SELECT 语句中使用子查询来实现,如下所示:

SELECT 
(SELECT T.Position From Table1 T Where T.Col1 = Agg.Max1) AS Pos1,(SELECT T.Position From Table1 T Where T.Col2 = Agg.Max2) AS Pos2,(SELECT T.Position From Table1 T Where T.Col3 = Agg.Max3) AS Pos3,(SELECT T.Position From Table1 T Where T.Col4 = Agg.Max4) AS Pos4
FROM
(SELECT Max(T1.Col1) AS Max1,Max(T1.Col2) AS Max2,Max(T1.Col3) AS Max3,Max(T1.Col4) AS Max4
FROM Table1 T1) AS Agg

我不认为这比这里的其他解决方案更冗长,我发现它更容易浏览和理解,而且它肯定比 VBA 工作得更快。即使像您说的那样有 40 列,也只需复制粘贴即可获得结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。