我在SQL Server中有两个表:Customer和Address
客户表:
CustomerID FirstName LastName
----------- ---------- ----------
1 Andrew Jackson
2 George Washington
Run Code Online (Sandbox Code Playgroud)
地址表:
AddressID CustomerID AddressType City
----------- ----------- ----------- ----------
1 1 Home Waxhaw
2 1 Office Nashville
3 2 Home Philadelphia
Run Code Online (Sandbox Code Playgroud)
这是我需要的输出:
CustomerID Firstname HomeCity OfficeCity
----------- ---------- ---------- ----------
1 Andrew Waxhaw Nashville
2 George Philadelphia Null
Run Code Online (Sandbox Code Playgroud)
这是我的查询,但没有得到正确的结果:
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
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果:
CustomerID Firstname HomeCity OfficeCity
----------- ---------- ---------- ----------
1 Andrew Waxhaw NULL
1 Andrew NULL Nashville
2 George Philadelphia Null
Run Code Online (Sandbox Code Playgroud)
如您所见,客户1在最终结果中出现两次.每个客户只能获得一行吗?
我查了一下这个例子,但没有帮助:http://stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns
谢谢
Gar*_*thD 18
它给出了这一行,因为你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
Run Code Online (Sandbox Code Playgroud)
虽然我倾向于INNER JOIN在客户和地址之间使用显式而非隐式连接.
我会这样写它:
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'
Run Code Online (Sandbox Code Playgroud)