4

重複の可能性:
Ms Accessクエリ:クエリによる行の連結

多くの列があるテーブルがありますが、関心のある2つは注文番号と製品タイプです。現在、テーブルには注文ごとに複数の製品タイプがあります。顧客が電話サービス、TVサービス、インターネットサービスを注文した場合、3つのレコードがあります。サービスごとに1つですが、すべて同じ注文番号です。顧客が注文したすべてのサービスを連結した文字列を格納するための参照テーブルを作成したいと思います。このようにして、このより論理的な方法を使用してデータを要約できます。標準のAccess2010データベースを使用しています。

**Current table:**

Order Number | Product Types

100001 | TV

100001 | Phone

100001 | Internet

100002 | Phone

100003 | TV

100003 | Internet

必要な参照表

100001 | TV/Phone/Internet

100002 | Phone

100003 | TV/Internet
4

4 に答える 4

6

Allen Browne は、これに役立つ関数を提供しています: Concatenate values from related records。その関数のコードを標準モジュールに保存します。

SELECT DISTINCT
    [Order Number],
    ConcatRelated("[Product Types]",
        "YourTable",
        "[Order Number] = " & [Order Number],
        "[Product Types]",
        "/"
        ) AS All_Product_Types
FROM YourTable;

「 YourTable 」という名前のテーブルに保存されたサンプル データを使用して、Access 2007 でそのクエリをテストしました。要求した結果が返されました。ただし、これは Access セッション内からのみ機能します。このクエリを Access の外部 (ASP など) から実行する場合、ユーザー定義関数は使用できないため、ConcatRelated()認識されないというエラーが発生します。

そのため、クエリを使用して、連結された値を必要なときにいつでも取得できます。ただし、これらの連結された値 を保存すると、ベース テーブルのデータへの変更とすぐに同期しなくなる可能性があります。

于 2012-09-14T16:14:58.060 に答える
1

SO に関する初期の投稿で onedaywhen が指摘したように、これは ADO を使用すると簡単です。

   SELECT [Order Number], 
          ConcatADO("SELECT [Product Types] FROM Orders
                     WHERE [Order Number]=" & [Order Number],", "," : ") AS Cat
   FROM Orders
   GROUP BY [Order Number], 2;

ADOを使用した機能

Function ConcatADO(strSQL As String, strColDelim, _
   strRowDelim, ParamArray NameList() As Variant)

   Dim rs As New ADODB.Recordset
   Dim strList As String

   On Error GoTo Proc_Err

       If strSQL <> "" Then
           rs.Open strSQL, CurrentProject.Connection
           strList = rs.GetString(, , strColDelim, strRowDelim)
           strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
       Else
           strList = Join(NameList, strColDelim)
       End If

       ConcatADO = strList

   Exit Function

   Proc_Err:
       ConcatADO = "***" & UCase(Err.Description)
End Function
于 2012-09-14T17:41:02.863 に答える
1

私が質問を理解している場合、あなたはテレビ、電話、インターネットを持っている注文の注文番号を取得する方法を尋ねています. これらの注文番号だけに興味がある場合は、次のようなクエリを実行できます。

SELECT Distinct Table1.OrderNumber
FROM (Select OrderNumber from Table1 where [product types]= "Internet")  AS i
    INNER JOIN ((Select OrderNumber from Table1 where [product types]="Phone")  AS p 
    INNER JOIN ((Select OrderNumber from Table1 Where [product types]= "TV")  AS tv 
    INNER JOIN Table1 ON tv.OrderNumber = Table1.OrderNumber) ON p.OrderNumber = Table1.OrderNumber) ON i.OrderNumber = Table1.OrderNumber;
于 2012-09-14T16:20:54.587 に答える
0

レコードを連結する参照テーブルを作成しないでください。それはデータベースの非正規化です。

以下のようなクロス集計クエリを試すことができますが、テストしていません。詳細については、こちらをご覧ください。

TRANSFORM First([Product Types]) AS Product
SELECT [Order Number], First([Product Types])
FROM CurrentTable
GROUP [Order Number]
于 2012-09-14T16:01:32.960 に答える