web-dev-qa-db-ja.com

MSアクセスクエリ:クエリを介した行の連結

次の情報を含むMS Accessのテーブルがあるとします。

ColumnA ColumnB
1       abc
1       pqr
1       xyz
2       efg
2       hij
3       asd

私の質問は、2番目の列の値を最初の列に基づいて行の値に連結するにはどうすればよいかということです。必要なクエリ結果は次のとおりです。

ColumnA ColumnB
1       abc, pqr, xyz
2       efg, hij
3       asd

クエリを介してこれを達成したいです。誰かがこれを達成するのを助けることができますか?

24
reggie

連結を行う関数が必要です。

Microsoft Accessはテーブル内の複数の行を要約します

データを使用した例:

Select T.ColumnA
  , GetList("Select ColumnB From Table1 As T1 Where T1.ColumnA = " & [T].[ColumnA],"",", ") AS ColumnBItems
From Table1 AS T
Group By T.ColumnA;
23
Thomas

ここに顕著なリンクがあります:関数を呼び出すことによってSQL内からこれを行う方法。指示は非常に明確で、機能はあなたのために書かれているので、あなたはただコピーして貼り付けて行くことができます。 VBの知識がない人でも簡単に実装できます。 関連レコードの値を連結

8
Deborah Cole

これを入手するのは非常に困難です。関数ではなくクエリで実行する必要がある場合、実行される問題は、1つの列に連結できる行数の制限です。これまでのところ、これを達成するために見つけた唯一の方法は、iifステートメントを使用することです。

SELECT 
test1.ColumnA AS ColumnA, 
First([test1].[ColumnB]) & IIf(Count([test1].[ColumnB])>1,"," & Last([test1].[ColumnB])) AS ColumnB
FROM test1
GROUP BY test1.ColumnA;

戻り値:

ColumnA  ColumnB 
1      abc,xyz 
2      efg,hij 
3      asd

これは最初と最後だけを返しますが、少しの作業でChoose関数を実行できると確信していますが、先ほど言ったように、追加する各追加項目にさらにiifステートメントを追加する必要があるため、制限。

3
Patrick

テーブルには、ColumnA-sequenceの一意の主キーを与えるシーケンス列を含めることができます。

table: t1
ColumnA sequence ColumnB
1       1        abc
1       2        pqr
1       3        xyz
2       1        efg
2       2        hij
3       1        asd

そして、クロスタブを作成できます:

query: x1
TRANSFORM Min([columnB] & ", ") AS Expr1
SELECT t1.columnA
FROM t1
GROUP BY t1.columnA
PIVOT t1.sequence;

columnA 1    2    3
1       abc, pqr, xyz,
2       efg, hij,
3       asd,

次に、最終クエリで列を結合し、最後のカンマを削除できます。

SELECT x1.columnA, Left([1] & [2] & [3],Len([1] & [2] & [3])-2) AS columnB FROM x1;

columnA columnB
1       abc, pqr, xyz
2       efg, hij
3       asd

シーケンスの入力を自動化するには、次のVBAコードを使用できます。

Sub fill_sequence_t1()
  Dim i: i = 1
  Do While DCount("*", "t1", "sequence IS NULL") > 0
    DoCmd.RunSQL "SELECT t1.columnA, Min(t1.columnB) AS columnB_min INTO t2" & _
                 " FROM t1 WHERE t1.sequence IS NULL GROUP BY t1.columnA;"
    DoCmd.RunSQL "UPDATE t1 INNER JOIN t2 ON (t1.columnA = t2.columnA)" & _
                 " AND (t1.columnB = t2.columnB_min) SET t1.sequence=" & i
    CurrentDb.TableDefs.Delete "t2"
    i = i + 1
  Loop
End Sub
1
Will