16

SQL Server に Customer と Address の 2 つのテーブルがあります。

顧客テーブル:

CustomerID  FirstName  LastName
----------- ---------- ----------
1           Andrew     Jackson         
2           George     Washington

アドレス テーブル:

AddressID   CustomerID  AddressType City
----------- ----------- ----------- ----------
1           1           Home        Waxhaw     
2           1           Office      Nashville    
3           2           Home        Philadelphia

これは私が必要とする出力です:

CustomerID  Firstname  HomeCity      OfficeCity
----------- ---------- ----------    ----------
1           Andrew     Waxhaw        Nashville
2           George     Philadelphia  Null

これは私のクエリですが、正しい結果が得られません:

SELECT CustomerID, Firstname, HOme as HomeCity, Office as OfficeCity FROM 
   (SELECT C.CustomerID, C.FirstName, A.AddressID, A.AddressType, A.City 
    FROM Customer C, Address A 
    WHERE C.CustomerID = A.CustomerID)as P
PIVOT (MAX(city) FOR AddressType in ([Home],[Office])) as  PVT

これは私が得ている結果です:

CustomerID  Firstname  HomeCity      OfficeCity
----------- ---------- ----------    ----------
1           Andrew     Waxhaw        NULL
1           Andrew     NULL          Nashville
2           George     Philadelphia  Null

ご覧のとおり、顧客 1 は最終結果に 2 回表示されています。顧客ごとに 1 つの行のみを取得することは可能ですか?

この例を調べましたが、役に立ちませんでした: http://stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns

ありがとう

4

2 に答える 2

22

AddressIDサブクエリ「P」の選択リストにあるため、この行が表示されます。したがって、これを選択する最上位に AddressID がなくても、PIVOT関数はそれによってグループ化されています。これを次のように変更する必要があります。

SELECT  CustomerID, Firstname, Home as HomeCity, Office as OfficeCity 
FROM    (   SELECT C.CustomerID, C.FirstName, A.AddressType, A.City 
            FROM #Customer C, #Address A 
            WHERE C.CustomerID = A.CustomerID
        ) AS P
        PIVOT 
        (   MAX(city) 
            FOR AddressType in ([Home],[Office])
        ) AS  PVT

INNER JOINcustomer と Address の間の暗黙的な結合ではなく、明示的な結合を使用する傾向がありますが。

于 2012-04-25T16:22:31.797 に答える
12

代わりに次のように書きます。

SELECT C.CustomerID, C.Firstname,
    Home.City as HomeCity,
    Office.City as OfficeCity
FROM Customer C
    LEFT JOIN Address Home
        on Home.CustomerID = C.CustomerID and Home.AddressType = 'Home'
    LEFT JOIN Address Office
        on Office.CustomerID = C.CustomerID and Office.AddressType = 'Office'
于 2012-04-25T16:19:01.510 に答える