2012-04-25 18 views
6

Tengo dos tablas en SQL Server: y dirección del clienteSQL con cuerdas

Tabla cliente:

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

tabla de direcciones:

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

Ésta es la salida que necesito:

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

Esta es mi consulta, pero no obtener el resultado correcto:

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 

Este es el resultado de que estoy recibiendo:

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

Como se puede ver al cliente 1 está apareciendo dos veces en el resultado final. ¿Es posible obtener solo una fila por cliente?

Miré hacia arriba este ejemplo, pero no ayudó: http: //stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns

Gracias

Respuesta

11

se trata de dar esta fila porque tiene AddressID en la lista de selección para usted subconsulta "P". Por lo tanto, aunque no tenga AddressID en su nivel superior, seleccione esto, la función PIVOT aún se está agrupando. Es necesario cambiar esto:

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 

Aunque yo me inclinaría a usar un INNER JOIN explícita en lugar de una unión entre implícito y dirección del cliente.

+0

¡Maravilloso, funcionó! ¡¡Gracias!! No me di cuenta de que la ID de dirección lo estaba causando. Me acostumbré a las uniones implícitas, pero comenzaré a usar INNER JOIN como lo mencionaste. – kthiagar

+1

En este escenario, no hay mucha diferencia si se utilizan combinaciones internas o implícitas, y hay varias discusiones diferentes sobre el tema, por ejemplo [aquí] (http://stackoverflow.com/questions/44917/explicit -vs-implicit-sql-joins). Mi opinión personal es que las uniones explícitas son más fáciles de leer, permiten un cambio más fácil entre las uniones 'INTERIOR' y 'EXTERIOR', y también reducen la probabilidad de uniones cruzadas accidentales al omitir una cláusula where. – GarethD

6

lo escribiría esta forma:

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

Gracias, esta parece ser otra buena forma de hacerlo sin usar PIVOT. – kthiagar