- 締切済み
Access 上位5位の抽出
商品名と出荷日付が含まれるテーブルAがあり、出荷日付が異なる同じ商品名のレコードがたくさんあります。 例えば、商品名(重複なし)を含む100レコードからなるテーブルBをエクセルかなんかで顧客から渡されるとしたとき(仕様変更依頼できません)、Bにある商品名100レコード全部につき、出荷日付の最近の履歴5件ずつを抽出して、 商品1の最近5件、商品2の最新5件…商品100の最新5件 (計500レコード) というクエリを作りたいのですが、どういう設定をすればよいでしょうか。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- psgrade
- ベストアンサー率86% (19/22)
ひとつのクエリでは無理と思います。 やり方としては次のようになります。 テーブルBと品名が一致するテーブルAのデータを抽出するテーブル作成クエリを実行します。この時、テーブルAで「出荷日順」という長整数型フィールドを追加して置きます。新規テーブル名tempで、SQLは下記のようです。 クエリ1: SELECT テーブルA.商品名, テーブルA.出荷日付, テーブルA.出荷日順 INTO temp FROM テーブルA INNER JOIN テーブルB ON テーブルA.商品名 = テーブルB.商品名; 次に、tempを商品名順、出荷日付降順で並べ替える「tempSorted」クエリを下記のように作ります。 クエリtempSorted: SELECT temp.商品名, temp.出荷日付, temp.出荷日順 FROM temp ORDER BY temp.商品名, temp.出荷日付 DESC; 次に「tempSorted」をVBAから開き、出荷日順フィールドに品名毎に123・・・と連番を振り、これが5以下のものを抽出して表示させます。 tempを作り、連番を振って、出荷日順が5以下のレコードを抽出表示するVBA: Private Sub コマンド0_Click() Dim MyDb As DAO.Database, rs As DAO.Recordset, i As Integer, NameTemp As String DoCmd.SetWarnings False DoCmd.OpenQuery "クエリ1" DoCmd.SetWarnings True Set MyDb = CurrentDb() Set rs = MyDb.OpenRecordset("tempSorted") rs.MoveFirst NameTemp = "" With rs Do Until .EOF If ![商品名] <> NameTemp Then i = 1 End If .Edit ![出荷日順] = i .Update NameTemp = ![商品名] i = i + 1 .MoveNext Loop .Close End With Set rs = Nothing Set MyDb = Nothing DoCmd.OpenQuery "クエリ2" '出荷日順が5以下のデータを抽出して表示 End Sub クエリ2: SELECT temp.商品名, temp.出荷日付 FROM temp WHERE (((temp.出荷日順)<=5)) ORDER BY temp.商品名, temp.出荷日付 DESC; これで目的は達せられると思います。