2012-04-26 8 views
0

私はしばらくの間、この問題を抱えていましたが、まだそれを得ることができませんでした。ここにあります:Msアクセスランク2つの質問に一致

私は私のAccesデータベースといくつかのquerysにいくつかのテーブルを持っています。私はいくつかのフィールドを選択して、例えばその頻度で注文するクエリを持っています。これは2つのテーブルに対して行われ、2つのランクを与えます。このようになります(と、より高い周波数が上にあるので、DESCを並べ替えられています):

 
Table 1     Table 2 
Value1 Frequency1   Value2 Frequency2 

Table2.Value2はTable1.Value1のサブセットであるので、私は値2と値1と一致し、プラス値2を示す列を追加したいです私は、フィールドの行番号を返す方法を検索した

 
Table3 
Value1 Frequency1 Frequency2 PositionTable2 

(couldn」:表2の位置(順位)ので、私は比較することができ、それは私のようなものがあるでしょう表1と表2 ranks.So上の位置です私は2つのテーブルをまとめてValueでマッチさせることができますが、必要な結果を得ることはできません。

SQLの私の知識が限られている、と私は全くVBを理解していないので、事前に素敵:) おかげ

編集 してください例:

 
Table 1     Table 2 
Name Frequency Name Frequency 
Mary  5   Paul  2 
John  4   John  1 
Paul  3 

出力I欲しい:

 
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

を持っていますか結果。 – Linger

+0

表3のランクは何ですか? – Linger

+0

テーブル1に同じランク – elithin

答えて

1

BY Table1.Name = Table2.Name オーダーの名前を登録しよう:

ステップ1 - クエリを作成します。 SQLはこのようになります。表2のためのランクを算出する(たとえば、「ランクを表2」という名前):

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; 
+0

Step1では、あなたが合意したOR句を使用していても、いくつかの行の位置が同じ(同じランク)のランクが与えられました。ランクは数字を逃します。なぜなら、osの繰り返し(1,2,4,4,6,6 ...)。名前にスペースが含まれている場合、OR句は機能しますか? – elithin

+0

申し訳ありません。 ORを使用する場合、 '[Self]。[Frequency]> [Table 2]。[Frequency]'のように、最初の条件を厳密に比較よりも大きくするように変更する必要があります。私はこれを示すために私の答えを編集しました。 –

+0

ありがとうございます!本当に素晴らしい仕事をした! – elithin

1

Accessの限られたSQLはランクcを理解していないので私はVBAを使うだろう非常にうまくいく。ここに手順があります。

  1. Table2の3番目のフィールドを作成し、それをRankと呼んでください。

  2. Alt + F11、Insert-> 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、表1 FROM Table2.Frequency AS周波数2、Table2.Rank を作成します。 LEFT OUTERは、次の2つのステップでこれを行う可能性がありますTable2.Frequency

+0

私のコードは正しく書式設定されていません。理由はわかりません。申し訳ありません。 – SQLCurious

+0

私が言ったように、私はVBを全く理解していません。私は "Sub RankTable"と "EndSub"という行を外すべきですか? – elithin

+0

また、表1と表2はquerysです。クエリの結果にRankという新しい列を挿入できますか?そして、このルーチンをクエリで実行できますか? – elithin

関連する問題