ホームページ >データベース >mysql チュートリアル >カスタム関数を使用して MS Access クエリの行を連結する方法
紹介:
Microsoft Access では、カスタム関数を使用して、複数のデータ行を 1 つの行に結合できます。この手法は、共通フィールドに基づいてデータを要約する必要がある場合に特に役立ちます。
質問:
MS Access に次のデータを含むテーブルがあるとします。
ColumnA | ColumnB |
---|---|
1 | abc |
1 | pqr |
1 | xyz |
2 | efg |
2 | hij |
3 | asd |
あなたの目標は、最初の列 (ColumnA) の一意の行ごとに、2 番目の列 (ColumnB) の値を 1 つの行に結合することです。望ましい出力は次のとおりです:
ColumnA | ColumnB |
---|---|
1 | abc, pqr, xyz |
2 | efg, hij |
3 | asd |
カスタム関数ソリューション:
これを行うには、Access で結合を実行するカスタム関数を定義します。ステップバイステップのガイドは次のとおりです:
<code class="language-vba">Public Function GetList(strSQL As String, Optional strDelimiter As String = ", ", Optional strValueList As String = "") Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset(strSQL) Do While Not rs.EOF strValueList = strValueList & rs(0) & strDelimiter rs.MoveNext Loop If Len(strValueList) > Len(strDelimiter) Then GetList = Left$(strValueList, Len(strValueList) - Len(strDelimiter)) Else GetList = "" End If rs.Close Set rs = Nothing End Function</code>
この関数は 3 つのパラメータを受け入れます:
クエリでカスタム関数を使用して値を連結できるようになりました。次の SQL ステートメントをクエリに入力します:
<code class="language-sql">SELECT ColumnA, GetList("SELECT ColumnB FROM Table1 WHERE ColumnA = " & [ColumnA]) AS ConcatenatedValues FROM Table1 GROUP BY ColumnA;</code>
このクエリは行を ColumnA ごとにグループ化し、GetList() 関数を使用して各グループの ColumnB の値を連結します。
クエリの出力は、目的の結果を含むテーブルになります:
ColumnA | ConcatenatedValues |
---|---|
1 | abc, pqr, xyz |
2 | efg, hij |
3 | asd |
この改訂された回答では、次のように VBA コードが改善されています。
If Len(strValueList) > Len(strDelimiter) Then
ブロックは、SQL クエリが行を返さない場合に、関数が末尾の区切り文字の代わりに空の文字列を返すようにします。これにより、関数がより堅牢かつ効率的になります。 この例の SQL クエリも、わかりやすくするために若干簡略化されています。
以上がカスタム関数を使用して MS Access クエリの行を連結する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。