2017-03-09 12 views
0

私は2つのテーブル会社と電話を持っています。電話番号表は、1社が多数の電話番号を持つことができる会社と1対1の関係を持っています。会社に対応する各電話番号を取得し、それらを会社と一緒に1つの行に配置するクエリを作成するにはどうすればよいですか?1対多テーブルの結果が列に入れられるクエリを作成する方法

テーブルの構造とデータの例:

Table one: Company Table 
Fields: CompanyID, CompanyName 
       1, ABC 
       2, DEF 
       3, GHI 

Table Two: Phone Number 
Fields: Id, CompanyID, Phone 
     1,   1, 555-5551 
     2,   1, 555-5552 
     3,   2, 555-5553 
     4,   3, 555-5554 

私は

Company Name, Phone1, Phone2 
     ABC, 555-5551, 555-5552 
     DEF, 555-5553 
     GHI, 555-5554 

につながるクエリを作りたいが、このピボットになるだろうクエリを作成する方法はあります。

これまで、電話機テーブルにタイプと呼ばれるフィールドを追加することで、私はこれをやっていました。ユーザーは携帯電話、陸上線、モバイルのいずれかを指定しなければなりませんでした。その特定のタイプを探すためのselect文がありますが、電話番号テーブルに追加フィールドを追加する必要がないようにする方法があるのだろうかと思います。そして、これを行う方法があれば、それについての用語も同様です。

+0

は、クロス集計クエリである - それは、関連する複数の行を取るとに配置します1行そして、ちょうどあなたの声明「あなたの電話番号テーブルには、会社との関係がたくさんあります。はい、「1対多数」がありますが、1社は多くの電話に対応しています。 :) –

答えて

2

@ chaのアプローチは近いですが、あなたが望む列見出しを取得しない限り、近いです。一意の電話番号の数をカウントするには、this postのように、Access/JetにはROW_NUMBER()やRANK()などのSQLの風味がないため、自己結合クエリでいくつかトリッキーを行う必要があります。これを行うためのクエリを作成し、そのクロス集計を実行すると、パフォーマンスに影響します。何百ものレコードしか持っていないのなら、それは気付かないかもしれませんが、もし何千ものレコードなら、あなたはそうかもしれません。これは、各電話番号が何に対応しているかを識別する列を持つ方が良い理由です。 (そして、エンドユーザーとしてそのデータにアクセスするという点で、とにかく誰かのオフィスに電話をかけるのか、自宅の電話にするのかを知りたくないのですか?)。

このルートを進めたい場合は、ここで行います。まず、あなたは、各電話番号をラベル付けするクエリを持っている:@chaが言ったように、その後 enter image description here

、クロス集計クエリを実行し、会社のテーブルに参加:

SELECT p1.ID, p1.CompanyID, p1.Phone, "Phone" & count(*) As PhoneRank 
FROM [Phone Number] as p1 INNER JOIN [Phone Number] AS p2 
ON (p1.CompanyID = p2.CompanyID) AND (p1.ID >= p2.ID) 
GROUP BY p1.ID, p1.CompanyID, p1.Phone; 

結果は次のようになります過程の中で。私は、クエリウィザードを避けることを好む。私のクロス集計のデザインビューは、次のようになります

enter image description here

そして、最終的な結果は次のようになります。あなたが望む

enter image description here

+0

私は自分の答えを編集しようとしていました。あなたは最初ですから、私は私を削除しています – cha

+0

これは完璧です、教えてくれてありがとう。 – Mallow

関連する問題