- ベストアンサー
ACCESS2000 で 上位2件を抽出する方法
クエリ上は下記の通りになっております。よろしくお願いします。 アーティスト 曲名 回数 AAA ???? ????? AAA ???? ????? AAA ???? ????? BBB ???? ????? BBB ???? ????? BBB ???? ????? BBB ???? ????? アーティストの数は同一名で20タイトルあれば10タイトルとバラバラです。 各アーティストの持ち歌の中から上位2曲(アーティスト 曲名 回数順で表記)抽出したいのですが、お解りになる方、お教えください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
tab1: アーティスト_曲名_回数 A____________A1______1 A____________A2______3 A____________A3______2 B____________B1______3 B____________B2______2 B____________B3______1 [イミディエイト] ? DBSelect("SELECT * FROM [クエリ1] WHERE 順位<=2 ORDER BY [アーティスト], 順位",,vbcrlf) A;A2;3;1; A;A3;2;2; B;B1;3;1; B;B2;2;2; これで、アーティスト毎の上位2曲を抽出しています。 クエリ1: アーティスト_曲名_回数_順位 A____________A1______1____3 A____________A2______3____1 A____________A3______2____2 B____________B1______3____1 B____________B2______2____2 B____________B3______1____3 テーブル[tab1]には存在しなかった[順位]列がクエリには追加されています。 ですから、当然に’順位<=2’という条件で抽出可能。 順位: DBCount("*","tab1","[アーティスト]='" & [アーティスト] & "' AND 回数>=" & [回数]) 私は、プログラマでもなんでもないただのおっさんです。 ですから複雑なSQL文を考えるのは苦手です。 ですから、次のDBCount関数で安直にカレント行より以上の[回数]行をカウントして[順位]列を生成。 Access のクエリには、このように自作関数を組み込めるので許される芸当です。 ※SQL文の王道に則った回答は他者のを参考になさってください。 Public Function DBCount(ByVal strField As String, _ ByVal strTable As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal ReturnValue = 0) As Variant On Error GoTo Err_DBCount Dim N Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst N = .Fields(0) End If End With Exit_DBCount: On Error Resume Next rst.Close Set rst = Nothing DBCount = IIf(N <> 0, N, ReturnValue) Exit Function Err_DBCount: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBCount End Function
お礼
ご返信が遅くなりまして申し訳ございません。 ご丁寧にありがとうございました。 問題なく、解決いたしました。