2016-07-11 5 views
1

CusのテーブルのJOIN:私はPIVOTを作り、

+----+-------------------------+------+ 
| ID |   Name   | Age | 
+----+-------------------------+------+ 
| 1 | Japhet     | 22 | 
| 2 | Abegail     | 31 | 
| 3 | Norlee     | 35 | 
| 4 | Pacita     | 60 | 
| 5 | Reynaldo    | 65 | 
| 6 | Barro, Reynaldo Batucan | 65 | 
| 7 | Batucan, Japhet C.  | NULL | 
| 8 | Barro, Reynaldo B.  | NULL | 
+----+-------------------------+------+ 

Cus2テーブル:(CusのとCus2は一対多の関係を持っている)

+-----+------+-----------------+---------------+ 
| QID | ID |  Name  | Country | 
+-----+------+-----------------+---------------+ 
| 1 | 1 | Japhet   |    | 
|  | PH |     |    | 
| 2 | 1 | NULL   | CN   | 
| 3 | 1 | Japhet   | PH   | 
| 4 | 1 | Japhet   | PH   | 
| 5 | 2 | NULL   | PH   | 
| 6 | 2 | NULL   | CN   | 
| 7 | 2 | John Hammond | United States | 
| 8 | 3 | Mudassar Khan | India   | 
| 9 | 3 | Suzanne Mathews | France  | 
| 11 | 4 | Japhe   | PH   | 
| 12 | 4 | Abegail   |    | 
|  | PH |     |    | 
| 13 | 4 | Abegail   |    | 
|  | US |     |    | 
| 14 | 3 | LOL    |    | 
|  | UK |     |    | 
| 15 | 4 | Japhet   |    | 
|  | PH |     |    | 
| 16 | 3 | Abegail   |    | 
|  |  |     |    | 
| 17 | 2 | Japhet   |    | 
|  | FR |     |    | 
| 18 | 1 | Japhet   | PH   | 
| 19 | 4 | Japhet   | PH   | 
| 20 | 3 |     | NULL   | 
| 21 | 2 | Abegail   | CN   | 
| 22 | 1 | Japhet   | PH   | 
| 23 | 5 | Japhet   | USA   | 
| 24 | 5 | Abegail   | CN   | 
| 25 | 5 | Japhet   | PH   | 
| 26 | NULL | NULL   | NULL   | 
| 27 | NULL | NULL   | NULL   | 
| 28 | NULL | NULL   | NULL   | 
| 29 | 8 | Japhet   | PH   | 
| 30 | 7 | Abegail   | CN   | 
| 31 | 8 | Japhet   | PH   | 
| 32 | 7 | Abegail   | USA   | 
| 33 | 7 | Abegail   | PH   | 
| 34 | 8 | Abegail   | CN   | 
+-----+------+-----------------+---------------+ 

私はピボットを作成し、

CREATE PROCEDURE [dbo].[Procedure5] 
as 
SELECT * 
FROM Cus S 
    INNER JOIN (
     SELECT * 
     FROM 
     (SELECT * FROM Cus2) I 
     PIVOT (Max(I.Name) FOR I.Country IN (PH, CN, USA)) P 
    ) I ON S.id = I.id 
; 
RETURN 0 
に参加

しかし、その出力には3つの類似した名前があります。どのようにすれば同じ行のすべてのデータのみが表示されるのですか。

私の希望する結果:

+----------+-----+--------+---------+--------+ 
| Name | Age | PH | CN | USA | 
+----------+-----+--------+---------+--------+ 
| Reynaldo | 65 | Japhet | Abegail | Japhet | 
+----------+-----+--------+---------+--------+ 

私の現在の出力:

+----------+-----+--------+---------+--------+ 
| Name | Age | PH | CN | USA | 
+----------+-----+--------+---------+--------+ 
| Reynaldo | 65 |  |   | Japhet | 
| Reynaldo | 65 |  | Abegail |  | 
| Reynaldo | 65 | Japhet |   |  | 
+----------+-----+--------+---------+--------+ 
+3

2つのテーブル(投稿のテキスト)のデータサンプルと予想される結果を追加できますか? –

+0

なぜピボットの結果をテーブル 'Cus'に戻していますか? – Squirrel

+2

ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

2

あなたのピボットクエリは、おそらく次のようになります。

SELECT * 
FROM (SELECT c.Name, 
       c.Age, 
       c2.Name [Name2], 
       c2.Country 
     FROM Cus c 
       INNER JOIN Cus2 c2 ON c.Id = c2.Id) t 
     PIVOT (
      MAX(Name2) 
      FOR Country IN ([PH], [CN], [USA]) 
     ) p 

ピボット・クエリを記述する場合、あなたは派生テーブルを作成することを確認し、唯一のあなたが最終的な結果に表示するフィールドを選択して、すべての列が別々の名前

アンに持っていることPIVOTの代わりにMAX(Case)式が使用されます。これはPIVOTよりも優れています。

SELECT c.Name, 
     c.Age, 
     MAX(CASE WHEN c2.Country = 'PH' THEN c2.Name END) AS [PH], 
     MAX(CASE WHEN c2.Country = 'CN' THEN c2.Name END) AS [CN], 
     MAX(CASE WHEN c2.Country = 'USA' THEN c2.Name END) AS [USA] 
FROM Cus c 
     INNER JOIN Cus2 c2 ON c.Id = c2.Id 
GROUP BY c.Name, 
     c.Age 
+0

OMG!それは魅力のように働いた。ありがとうございます:D –

+0

あなたは本当に近かったですが、ピボットクエリで 'Select *'を使用すると、通常、内部情報の中に '(SELECT Id、Name、Country FROM Cus2)'情報が多すぎます。あなたが望むものにあなたが近づいてくれたでしょう。 – JamieD77

+0

@ JaimeD77注目。ありがとう兄貴。これについてあなたにお礼を言います。 –