- ベストアンサー
ACCESSクエリでチケットを委託した人を抽出する方法
- ACCESS2010を使用している場合、クエリを利用してチケットを他の人に頼んで購入した人を抽出することができます。
- 具体的には、チケット購入者が自分で買わず他の人に頼んだ場合、その実購入者と委託者の情報を表示します。
- データが1,000件近くある場合でも、クエリを使用することで簡単に情報を抽出することができます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
フィールド名も変わってましたね。 SELECT T_購入.実購入者番号 AS 番号, T_購入.実購入者, First(MyJoin([実購入者番号])) AS 購入者一覧 FROM T_購入 GROUP BY T_購入.実購入者番号, T_購入.実購入者; 「委託者」バージョンも生かしておくなら MyJoin2 とか 名前を変えて 関数を作る必要があります。 そこが 専用の関数の不便なところですね。 YU-TANG さんのDJoin 関数なら、呼び出す側で引数を変えるだけで 関数に手を入れなくて済みますから、お勧めですが。
その他の回答 (5)
- m3_maki
- ベストアンサー率64% (296/460)
おっと、Order By 句 が抜けてますね ^^; t訂正。 strSQL = "Select チケット購入者 From T_購入 " & _ " Where 実購入者番号=" & Buyer & _ " ORDER BY 番号;"
- m3_maki
- ベストアンサー率64% (296/460)
No.3 です。 strSQL = "Select チケット購入者 From T_購入 " & _ "Where 実購入者番号=" & Buyer 未確認。
- m3_maki
- ベストアンサー率64% (296/460)
こちらの DJoin 関数を使って、 https://web.archive.org/web/20150517052733/http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaDJoin.html SELECT T_購入.実購入者番号 AS 番号, T_購入.実購入者, First(DJoin("チケット購入者","T_購入","実購入者番号=" & [実購入者番号] & "And 番号 <> 実購入者番号",255,"、",False,"番号")) AS 委託者 FROM T_購入 GROUP BY T_購入.実購入者番号, T_購入.実購入者; ---------------------------- 汎用的じゃなくてもよいから手軽に、というなら こちらの最小限に絞った専用の関数を使って Public Function MyJoin(Buyer As Long) As String On Error GoTo ErrorHandler ' 定数/変数宣言部 Dim rs As DAO.Recordset Dim strSQL As String Dim strResult As String strSQL = "Select チケット購入者 From T_購入 " & _ "Where 実購入者番号=" & Buyer & " AND " & _ "実購入者番号<>番号 " Set rs = CurrentDb.OpenRecordset(strSQL, _ dbOpenForwardOnly, _ dbReadOnly) ' メインループ Do Until rs.EOF ' 連結する文字列を取得し、追加します。 strResult = strResult & "、" & rs(0).Value rs.MoveNext Loop strResult = Mid(strResult, 2) ExitProcedure: On Error Resume Next rs.Close: Set rs = Nothing MyJoin = strResult ' 戻り値をセットします。 Exit Function ErrorHandler: ' クエリー内での使用を考慮して、エラーのダイアログ表示は ' 行なわず、エラーをそのまま戻り値に入れます。 strResult = Err & ":" & Err.Description Resume ExitProcedure End Function こちらの SQL で。 SELECT T_購入.実購入者番号 AS 番号, T_購入.実購入者, First(MyJoin([実購入者番号])) AS 委託者 FROM T_購入 GROUP BY T_購入.実購入者番号, T_購入.実購入者;
補足
m3_makiさん、いつもお世話になっております。 「MyJoin」関数で試してみたところ、テストデータで上手くいきました。大変ありがとうございます。 さて、もうひとパターン必要になりました。今回お教えいただいたのは、実購入者を除いた委託した人だけを一覧にした内容です。 もうひとパターンは、実購入者を含めた購入者一覧です。具体的には、下記のようにしたいと考えています。 【T_購入】 番号 チケット購入者 実購入者 実購入者番号 1 あああ あああ 1 2 いいい あああ 1 3 ううう あああ 1 4 えええ えええ 4 5 おおお えええ 4 6 かかか かかか 6 7 ききき かかか 6 8 くくく かかか 6 9 けけけ けけけ 9 【実購入者を含めた購入者一覧】 番号 実購入者 購入者一覧 1 あああ あああ、いいい、ううう 4 えええ えええ、おおお 6 かかか かかか、ききき、くくく 9 けけけ けけけ 以上、改めてご教示をお願いいたします。
- kkkkkm
- ベストアンサー率66% (1719/2589)
No1は実行毎に前回のデータの最後に追加してきますが、実行するたびに追加せずに毎回最初からデータを書き込む場合は Dim m番号 As Long, m実購入者 As String, m委託者 As String の後に DoCmd.SetWarnings False DoCmd.RunSQL "DELETE * from T_購入結果" DoCmd.SetWarnings True としてください。前回のデータを削除してから書き込みます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
クエリで チケット購入者 実購入者 実購入者番号 ↑抽出条件 <>[T_購入]![実購入者] という事ではなく委託者というフィールドにチケット購入者を「、」で区切って並べて収めたいということでしたら T_購入結果というテーブルを作成し、そこに 実購入者番号、実購入者、委託者 というフィールドを作成してもらって そのテーブルに結果を書き込むという手はいかがでしょう。 モジュールで Sub Test() Dim strSQL As String Dim Rst As DAO.Recordset Dim Rs As New ADODB.Recordset Dim m番号 As Long, m実購入者 As String, m委託者 As String strSQL = "" strSQL = "SELECT T_購入.実購入者番号, T_購入.実購入者, T_購入.[チケット購入者]" strSQL = strSQL & " FROM T_購入" strSQL = strSQL & " WHERE (((T_購入.[チケット購入者]) <> [T_購入]![実購入者]))" strSQL = strSQL & " ORDER BY T_購入.番号" Rs.Open strSQL, CurrentProject.Connection Set Rst = CurrentDb.OpenRecordset("T_購入結果", dbOpenTable) Rs.MoveFirst m番号 = Rs!実購入者番号 m実購入者 = Rs!実購入者 m委託者 = Rs!チケット購入者 & "、" Rs.MoveNext Do Until Rs.EOF If Rs!実購入者 = m実購入者 Then m委託者 = m委託者 & Rs!チケット購入者 & "、" Else With Rst .AddNew .Fields("実購入者番号") = m番号 .Fields("実購入者") = m実購入者 .Fields("委託者") = m委託者 .Update End With m番号 = Rs!実購入者番号 m実購入者 = Rs!実購入者 m委託者 = Rs!チケット購入者 & "、" End If Rs.MoveNext Loop With Rst .AddNew .Fields("実購入者番号") = m番号 .Fields("実購入者") = m実購入者 .Fields("委託者") = m委託者 .Update End With Rs.Close Rst.Close Set Rst = Nothing
お礼
kkkkkmさん、いつもお世話になっております。 大変長いモジュールをお考えいただきまして、誠にありがとうございます。 早速試してみたいと思います。 今後とも、どうぞよろしくお願いいたします。
お礼
m3_makiさん、いつもお世話になっております。 ご教示いただいた内容で、クエリにおいて私の思ったとおりの形で表示できました。 大変ありがとうございました。 今後とも、どうぞよろしくお願いいたします。