Ms Ms Rank并匹配两个查询

时间:2012-04-26 18:21:46

标签: sql ms-access match rank

我已经被这个问题困住了一段时间,但还是没能做到。这是:

我的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

2 个答案:

答案 0 :(得分:1)

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

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

  2. 按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

  3. 运行上面的子程序。 (请记住,每次对表2进行更新时都必须运行此命令。)

  4. 创建查询

    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;