2012-04-25 35 views
6

Tôi có hai bảng trong SQL Server: Khách hàng và Địa chỉSQL Pivot với String

khách hàng Bảng:

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

Địa chỉ Bảng:

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

Đây là sản phẩm mà tôi cần:

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

Đây là câu hỏi của tôi, nhưng không nhận được kết quả đúng:

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 

Đây là kết quả mà tôi nhận được:

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

Như bạn có thể thấy khách hàng 1 được hiển thị hai lần trong kết quả cuối cùng. Có thể chỉ nhận được một hàng cho mỗi khách hàng không?

Tôi nhìn lên ví dụ này, nhưng không giúp: http: //stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns

Cảm ơn

Trả lời

11

Nó cho hàng này vì bạn có AddressID trong danh sách chọn cho truy vấn con "P". Vì vậy, ngay cả khi bạn không có AddressID ở cấp cao nhất, hãy chọn chức năng PIVOT vẫn đang được nhóm theo nó. Bạn cần phải thay đổi điều này để:

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 

Mặc dù tôi sẽ có khuynh hướng sử dụng một rõ ràng INNER JOIN chứ không phải là một tiềm ẩn tham gia giữa khách hàng và địa chỉ.

+0

Tuyệt vời, điều đó đã hiệu quả! Cảm ơn!! Tôi đã không nhận ra addressID đã gây ra nó. Tôi đã quen với việc tham gia ngầm, nhưng tôi sẽ bắt đầu sử dụng INNER JOINs như bạn đã đề cập. – kthiagar

+1

Trong trường hợp này, nó không tạo ra nhiều khác biệt cho dù các tham gia ngầm hoặc bên trong được sử dụng, và có một số cuộc thảo luận khác nhau về chủ đề, ví dụ [here] (http://stackoverflow.com/questions/44917/explicit -vs-implicit-sql-joins). Quan điểm cá nhân của tôi là việc kết nối rõ ràng dễ đọc hơn, cho phép thay đổi dễ dàng hơn giữa các liên kết 'INNER' AND' OUTER' và cũng giảm khả năng kết hợp chéo ngẫu nhiên bằng cách thiếu mệnh đề where. – GarethD

6

Tôi sẽ viết nó như thế này thay thế:

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' 
+1

Cảm ơn, đây có vẻ là một cách hay để thực hiện việc này mà không cần sử dụng PIVOT. – kthiagar

Các vấn đề liên quan