我已经被这个问题困住了一段时间,但还是没能做到。这是:
我的Acces数据库中有一些表和一些查询。我有一个查询来选择一些字段并按顺序排序。这是为两个表格完成的,给我两个等级。看起来像这样(并且排序DESC,因此频率越高越好):
Table 1 Table 2 Value1 Frequency1 Value2 Frequency2
Table2.Value2是Table1.Value1的子集,所以我想匹配Value2和Value1加上在Table2上添加一个显示Value2位置(排名)的列,所以我可以比较它在Table1和Table2排名上的位置。所以我'我会有类似的东西:
Table3 Value1 Frequency1 Frequency2 PositionTable2
我已经搜索了如何返回字段的行号(无法使其工作),我可以将两个表放在一起并按Value匹配,但无法获得我需要的结果。< / p>
我对SQL的了解有限,我根本不懂VB,所以请你好:) 提前致谢
修改 例如:
Table 1 Table 2 Name Frequency Name Frequency Mary 5 Paul 2 John 4 John 1 Paul 3
我想要的输出:
Table 3 Name Frequency Frequency2 RankIn2 Mary 5 //doesn't appear in table2, freq=null rankin2=null John 4 1 2 //second line of table2 Paul 3 2 1 //first line in table2
答案 0 :(得分:1)
我会使用VBA,因为Access'有限的SQL不能很好地理解排名概念。以下是步骤。
为Table2创建第3个字段,并将其命名为Rank。
按Alt + F11,Insert-&gt; Module并在打开的编辑器窗口中粘贴以下代码,创建以下子例程。
Public Sub RankTable()
Dim rs As Recordset, iRank As Integer, strQuery As String
strQuery = "SELECT * FROM Table2 ORDER BY Freq DESC"
Set rs = CurrentDb.OpenRecordset(strQuery, dbOpenDynaset)
rs.MoveFirst
iRank = 1
Do
rs.Edit
rs.Fields(3) = iRank
rs.Update
rs.MoveNext
iRank = iRank + 1
Loop While Not rs.EOF
rs.Close
End Sub
运行上面的子程序。 (请记住,每次对表2进行更新时都必须运行此命令。)
创建查询
SELECT Table1.Name,Table1.Frequency,Table2.Frequency AS Frequency2,Table2.Rank 从表1 LEFT OUTER JOIN名称在Table1.Name = Table2.Name上 按顺序排列:Table2.Frequency
答案 1 :(得分:1)
您可以分两步完成此操作:
步骤1 - 创建一个查询(比如名为“带有排名的表2”),计算表2的排名.SQL可能如下所示:
SELECT
[Table 2].[Name],
[Table 2].[Frequency],
Count(*) AS [Rank]
FROM
[Table 2],
[Table 2] AS [Self]
WHERE
[Self].[Frequency]>=[Table 2].[Frequency]
GROUP BY
[Table 2].[Name],
[Table 2].[Frequency];
如果表2中存在“关系”(即具有相同频率的不同名称),则此查询将为两者分配相同的排名。如果您不想这样做,请更改WHERE子句以指定断开关系的方式。例如,如果出现平局,WHERE子句......
WHERE
[Self].[Frequency]>[Table 2].[Frequency]
OR
([Self].[Frequency]=[Table 2].[Frequency] AND [Self].[Name]<=[Table 2].[Name])
...将较低编号的等级分配给字母表中首先出现的名称。
步骤2 - 创建另一个将第一个查询连接到表1的查询.SQL可能如下所示:
SELECT
[Table 1].[Name],
[Table 1].[Frequency],
[Table 2 with Rank].[Frequency] AS [Frequency2],
[Table 2 with Rank].Rank AS [RankIn2]
FROM
[Table 1] LEFT JOIN [Table 2 with Rank]
ON [Table 1].[Name] = [Table 2 with Rank].[Name]
ORDER BY
[Table 1].[Frequency] DESC;