Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルクエリで重複するフィールドを基準にまとめたい
記事No171824
投稿日: 2017/05/14(Sun) 13:48
投稿者ロン
解決済: ON
OS:Windows7
Access Version:2016

たびたびこちらで学習させていただいております。
VBAは未熟なのですが、よろしくお願いします。

社名が重複していて、受注番号は各レコード固有の以下のようなテーブルを、

社名 受注番号
A社 1
C社 6
A社 2
B社 4
B社 5
A社 3

クエリ上で、以下、1.、2.のようにまとめたいのですが、

1.
社名 受注番号
A社 1,2,3
B社 4,5
c社 6

2.
社名 受注番号1 受注番号2 受注番号3
A社    1    2     3
B社   4   5
C社   6

それぞれの処理の方法が解らないので、教えていただけないでしょうか。

タイトルRe: クエリで重複するフィールドを基準にまとめたい
記事No171826
投稿日: 2017/05/14(Sun) 19:48
投稿者tkwan
解決済: ON
まず、1の方法

標準モジュールに

Function GetOrder(strName As String) As String

  Dim db     As DAO.Database
  Dim rs     As DAO.Recordset
  Dim strSQL As String

  strSQL = "Select 受注番号 From テーブル名 Where 社名 = '" & _
            strName & "' Order By 受注番号;"

  Set db = CurrentDb
  Set rs = db.OpenRecordset(strSQL)

  Do Until rs.EOF
     GetOrder = GetOrder & rs!受注番号 & ","
     rs.MoveNext
   Loop
 
   GetOrder = Left$(GetOrder, Len(GetOrder) - 1)

 End Function 

を組んでおいて、

クエリ
 Select Distinct 社名, GetOrder(社名) As 受注番号
    From テーブル名;
    
※「テーブル名」は実際のテーブル名に置き換えること。

 

タイトルRe^2: クエリで重複するフィールドを基準にまとめたい
記事No171827
投稿日: 2017/05/14(Sun) 22:28
投稿者tkwan
解決済: ON
では、2の方法

標準モジュールに

Function GetOrder2(strName As String, intOrder As Integer) As Variant

 Dim db     As DAO.Database
 Dim rs     As DAO.Recordset
 Dim strSQL As String

 strSQL = "Select Top 1 受注番号 From " & _
          "(Select Top " & intOrder & " 受注番号 From テーブル名" & _
          "  Where 社名 = '" & strName & "' Order By 受注番号)" & _
          "  Order By 受注番号 Desc;"
          
 Set db = CurrentDb
 Set rs = db.OpenRecordset(strSQL)

 GetOrder2 = rs!受注番号
  
 If DCount("受注番号", "テーブル名", "社名='" & strName & "'") < intOrder Then
    GetOrder2 = Null
  End If

End Function

を組んでおいて、

クエリ
SELECT DISTINCT 社名
       , GetOrder2(社名,1) AS 受注番号1
       , GetOrder2(社名,2) AS 受注番号2
       , GetOrder2(社名,3) AS 受注番号3
  FROM テーブル名;

タイトルRe^3: クエリで重複するフィールドを基準にまとめたい
記事No171829
投稿日: 2017/05/16(Tue) 10:40
投稿者tkwan
解決済: ON
おまけ。

もし、受注番号の数が3個以上になった場合、
ケース2のSQLをその都度書き直すのは面倒でしょうから、


 Dim db     As DAO.Database
 Dim rs     As DAO.Recordset
 Dim QDef   As DAO.QueryDef
 Dim i      As Integer
 Dim strSQL As String

 Set db = CurrentDb

  Set rs = db.OpenRecordset("SELECT MAX(F) AS FMax" & _
                            "  FROM (SELECT Count(*) AS F" & _
                            "          FROM テーブル名" & _
                            "         GROUP BY 社名)")
  For i = 1 To rs!FMax
    strSQL = strSQL & ", GetOrder2(社名," & i & ") AS 受注番号" & i
   Next
 
  strSQL = "SELECT DISTINCT 社名" & strSQL & _
           "  FROM テーブル名;"

  Set QDef = db.QueryDefs("2で作ったクエリの名前")

  QDef.SQL = strSQL

  DoCmd.OpenQuery (QDef.Name)
  
  QDef.Close: Set QDef = Nothing
  rs.Close:   Set rs = Nothing
  db.Close:   Set db = Nothing

を実行すれば自動的にクエリを書き直して開くことができます。

タイトルRe^4: クエリで重複するフィールドを基準にまとめたい
記事No171831
投稿日: 2017/05/17(Wed) 18:30
投稿者ロン
解決済: ON
tkwan様、お返事遅くなり、すみません。

質問致しました2パターンだけでなく、おまけまで頂き恐縮です。

教えて頂いたのを基に試したところ、無事、希望通りの結果が得られました。

本当にありがとうございました。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る