0

我已经被这个问题困住了一段时间,但还不能解决这个问题。这里是:

我的 Acces 数据库中有一些表和一些查询。我有一个查询来选择一些字段并按它们的频率排序。这是为两张桌子完成的,给了我两个等级。看起来像这样(并且是按 DESC 排序的,所以频率越高):

表 1 表 2
值 1 频率 1 值 2 频率 2

Table2.Value2 是 Table1.Value1 的子集,所以我想匹配 Value2 和 Value1 加上在 Table2 上添加一个显示 Value2 位置(排名)的列,这样我就可以比较它在 Table1 和 Table2 排名上的位置。所以我会有一些东西喜欢:

表3
值 1 频率 1 频率 2 位置表 2

我已经搜索了如何返回字段的行号(无法使其工作),我可以将两个表放在一起并按值匹配,但无法得到我需要的结果。

我对SQL的了解有限,而且我根本不懂VB,所以请善待:)提前谢谢

编辑 示例:

表 1 表 2
姓名 频率 姓名 频率
玛丽 5 保罗 2
约翰福音 4 约翰福音 1
保罗 3

我想要的输出:

表3               
名称 频率 Frequency2 RankIn2
Mary 5 //没有出现在table2中,freq=null rankin2=null
John 4 1 2 //table2 的第二行
Paul 3 2 1 //table2 的第一行
4

2 回答 2

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;
于 2012-04-26T20:43:42.083 回答
1

我会使用 VBA,因为 Access 的有限 SQL 不能很好地理解排名概念。以下是步骤。

  1. 为 Table2 创建第三个字段并将其命名为 Rank。

  2. 通过按 Alt+F11、Insert->Module 并在打开的编辑器窗口中粘贴以下代码来创建以下子例程。

    公共子排名表()

    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
    

    结束子

  3. 运行上述子程序。(请记住,每次对 Table2 进行更新时,您都必须运行它。)

  4. 创建查询

    SELECT Table1.Name, Table1.Frequency, Table2.Frequency AS Frequency2, Table2.Rank FROM Table1 LEFT OUTER JOIN Name ON Table1.Name = Table2.Name ORDER BY Table2.Frequency

于 2012-04-26T19:45:10.950 回答