web-dev-qa-db-ja.com

MS Accessで複数行を1行に連結する

可能性のある複製:
Access 2007の行を結合
Access 2007-1つのテーブルの1つの列のフィールドを、別のテーブルの1つのカンマ区切りの値に連結します

現在、次のようなテーブル構造があります。

名前------Desc---Thresh---Perc---Err---[〜#〜] bp [〜# 〜]
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 --- --ADC2
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 --- --BAC2
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 --- --RBE2
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 --- --VBE2
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 --- --AEC2
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 --- --PBC2
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- PBC2
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- ZTM2
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 2- ---- QYC2
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- FLC2
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1- ---- KSC2
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- JYC2

私がやろうとしていることは、「名前」と「猫」ごとに1行あることです。これにより、すべての「エラー」(「名前」と「猫」ごと)が合計され、「BP」フィールドのみが連結されます。単線。といった:

名前------Desc---Thresh---Perc---Err---[〜#〜] bp [〜# 〜]
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ---- -BAC2、VBE2、AEC2
ボブ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 --------- XBC4、ADC2
ジョー-------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3-- ---- QYC2、KSC2

同様の質問が寄せられましたが、VBAスクリプトに関する私の知識は初心者であるため、適用できないようです。 SQLを介してこれをすべて行う方法はありますか? VBAスクリプティングが唯一のオプション(つまり、関数の作成)である場合は、ヘルプをいただければ幸いです。前もって感謝します。

質問パート2:
アレンブラウンのガイドに従って関数を作成しました。モジュールはmodConcatRelatedとして保存されます。今、私はこのクエリを実行しようとしました(これが私が探している結果を得るための正しいSQLであるかどうかわかりません):

SELECT
    [Name],
    [Cat],
    [Desc],
    [Thresh],
    [Perc],
    sum([Err]),
    ConcatRelated("[BP]", "make_table_bp", "[Err] = " & [BP])
FROM make_table_bp
GROUP BY
    [Name],
    [Cat],
    [Desc],
    [Thresh],
    [Perc],
    [Err],
    [BP];  

「エラー3061。パラメータが少なすぎます。1が必要です。」また、「未定義の関数ConcatRelated」とありました。上記のようにConcatRelated関数を正しく呼び出して結果を生成できるように、正しいSQLステートメントを作成する方法に関するガイダンスを探しています。再度、感謝します。

次の質問:
テーブルの最後の列としてタグ付けされた一意の日付フィールドがある場合はどうなりますか。このようなもの:

名前------Desc---Thresh---Perc---Err---[〜#〜] bp [〜# 〜]---日付

ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 ----- ADC2-- 2011年12月2日
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 2 --- --BAC2--09/05/2011
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 --- --RBE2--11/02/2011
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 8 --- --VBE2--08/14/2012
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 6 --- --AEC2--02/25/2009
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 0 --- --PBC2--07/02/2011
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 1 ----- XBC4--09/05/2011
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- AEC2--02/02/2010
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- PBC2--08/14/2012
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 3 ----- ADC2--05/05/2001
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- ADC2--08/02/2010
ボブ------- C2 ------- Com ------ 8Per -------- 0.45 ------ 0 ----- BAC2--06/17/2010
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- PBC2--08/14/2012
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- ZTM2--09/05/2011
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 2- ---- QYC2--05/17/2010
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- FLC2--3/19/2010
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 1- ---- KSC2--09/05/2011
ジョー-------- C1 ------- Inf --------- 7Per -------- 0.05 ------ 0- ---- JYC2--08/14/2012

たとえば、次のようなクエリを作成したいとします。すべてのレコードを同じ形式で表示します。

名前------Desc---Thresh---Perc---Err---[〜#〜] bp [〜# 〜]
ボブ------- C1 ------- Inf -------- 7Per -------- 0.05 ----- 16 ---- -BAC2、VBE2、AEC2
ボブ------- C2 ------ Com ------ 8Per -------- 0.45 ------ 4 --------- XBC4、ADC2
ジョー-------- C1 ------- Inf -------- 7Per -------- 0.05 ------ 3-- ---- QYC2、KSC2

ただし、2009年1月1日から2011年9月31日までの日付範囲

@HansUpはこれを手伝ってくれる?

8
JT2013

各グループのErrの合計を計算するGROUP BYのサブクエリを使用しました。次に、サブクエリから返されたフィールドを使用して、ConcatRelated関数( from Allen Browne )を追加しました。これは、クエリとクエリからの出力(make_table_bpのサンプルデータに基づく)です。

SELECT
    sub.[Name],
    sub.Cat,
    sub.[Desc],
    sub.Thresh,
    sub.Perc,
    sub.SumOfErr,
    ConcatRelated("BP",
        "make_table_bp",
        "[Err] > 0 AND [Name] = '" & sub.[Name]
        & "' AND Cat = '"
        & sub.Cat & "'",
        "BP")
        AS concat_BP
FROM
    (SELECT
        q.[Name],
        q.Cat,
        q.[Desc],
        q.Thresh,
        q.Perc,
        Sum(q.[Err]) AS SumOfErr
    FROM make_table_bp AS q
    GROUP BY
        q.[Name],
        q.Cat,
        q.[Desc],
        q.Thresh,
        q.Perc
    ) AS sub
ORDER BY
    sub.Name,
    sub.Cat;

クエリは次の結果セットを出力します。

Name Cat Desc Thresh Perc SumOfErr concat_BP
Bob  C1  Inf  7Per   0.05       16 AEC2, BAC2, VBE2
Bob  C2  Com  8Per   0.45        4 ADC2, XBC4
Joe  C1  Inf  7Per   0.05        3 KSC2, QYC2

クエリで参照されているすべての場所で、Name、Desc、およびErrを角かっこで囲んだことに注意してください。すべて予約語です( Accessの問題名と予約語 を参照)。可能であれば、これらのフィールドに別の名前を選択してください。そうでない場合は、角括弧を使用して、dbエンジンの混乱を避けます。

ただし、ConcatRelated関数のコピーがデータベースエンジンによって認識されない限り、これが機能しません。なぜそうではないのか分かりません。私は、関数コードを保存するためにリストした同じ手順を実行しましたが、これは私のシステムで正常に機能します。

Edit:私は、[Err]が数値データ型であるバージョンのテーブルでクエリをテストしました。代わりにあなたのような音はテキストです。その場合は、数値も変更することをお勧めします。数値を実際の数値ではなくテキストとして保存することの利点はわかりません。

ただし、テキストとして[Err]が表示されない場合は、クエリを調整して処理できます。これを変える ...

"[Err] > 0 AND [Name] = '" & sub.[Name]

これに...

"Val([Err]) > 0 AND [Name] = '" & sub.[Name]

この変更により、[Err]をテキストデータタイプとしてテストしたときに、「条件式のデータタイプの不一致」エラーが回避されました。ただし、これも変更しました...

Sum(q.[Err]) AS SumOfErr

これに...

Sum(Val(q.[Err])) AS SumOfErr

2番目の変更は厳密には必要ないことをAFAICTそれらをSum()するように要求すると、dbエンジンは数値をテキストとして受け入れてくれるようです。ただし、私は、適切に推測するためにdbエンジンに依存するのではなく、明示的に数値に変換することを好みます。 dbエンジンには他にも対処するのに十分なものがあり、私が望んでいることを正確に伝えようとします。

Edit2:一意の値のみを連結したい場合は、ConcatRelated()関数を変更できます。コードのこのセクションを見つける...

'Build SQL string, and get the records.
strSql = "SELECT " & strField & " FROM " & strTable

これに変更して...

'Build SQL string, and get the records.
strSql = "SELECT DISTINCT " & strField & " FROM " & strTable
5
HansUp