電子書籍の厳選無料作品が豊富!

商品名と出荷日付が含まれるテーブルAがあり、出荷日付が異なる同じ商品名のレコードがたくさんあります。

例えば、商品名(重複なし)を含む100レコードからなるテーブルBをエクセルかなんかで顧客から渡されるとしたとき(仕様変更依頼できません)、Bにある商品名100レコード全部につき、出荷日付の最近の履歴5件ずつを抽出して、

商品1の最近5件、商品2の最新5件…商品100の最新5件 (計500レコード)

というクエリを作りたいのですが、どういう設定をすればよいでしょうか。

A 回答 (1件)

ひとつのクエリでは無理と思います。


やり方としては次のようになります。
テーブル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;

これで目的は達せられると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!