0

私はしばらくの間この問題に悩まされていました、そしてそれをまだ正しくすることができませんでした。ここにあります:

Accesデータベースにいくつかのテーブルといくつかのクエリがあります。いくつかのフィールドを選択し、それらの頻度などで並べ替えるクエリがあります。これは2つのテーブルに対して行われ、2つのランクが与えられます。このように見えます(そしてDESCでソートされているので、より高い頻度が一番上にあります):

表1表2
Value1 Frequency1 Value2 Frequency2

Table2.Value2はTable1.Value1のサブセットであるため、Value2とValue1を一致させ、さらにTable2のValue2の位置(ランク)を示す列を追加して、Table1とTable2のランクでの位置を比較できるようにします。お気に入り:

表3
値1頻度1頻度2位置表2

フィールドの行番号を返す方法を検索しましたが(機能しませんでした)、2つのテーブルを組み合わせて値で一致させることはできますが、必要な結果を得ることができません。

私のSQLの知識は限られており、VBもまったく理解していませんので、よろしくお願いします:)よろしくお願いします。

例の編集

表1表2
名前の頻度名前の頻度
メアリー5ポール2
ヨハネ4章ヨハネ1章
パウルス3世

私が欲しい出力:

表3               
名前FrequencyFrequency2RankIn2
メアリー5//table2に表示されない、freq = nullrankin2 = null
John 4 1 2//table2の2行目
Paul 3 21//テーブル2の最初の行
4

2 に答える 2

1

Accessの制限付きSQLはランクの概念をよく理解していないため、VBAを使用します。手順は次のとおりです。

  1. Table2の3番目のフィールドを作成し、それをランクと呼びます。

  2. Alt + F11、Insert-> Moduleを押し、開いたエディタウィンドウに次のコードを貼り付けて、次のサブルーチンを作成します。

    パブリックサブ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
    

    サブ終了

  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 に答える
1

これは2つのステップで行うことができます。

手順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 に答える