2012-04-25 13 views
6

Ho due tabelle in SQL Server: e indirizzo dell'acquirenteSQL pivot con String

Customer Table:

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

tabella degli indirizzi:

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

Questa è l'uscita di cui ho bisogno:

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

Questa è la mia interrogazione, ma non ottenere il giusto risultato:

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 

questo è il risultato che sto ottenendo:

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

Come si può vedere Cliente 1 sta rivelando due volte in il risultato finale. È possibile ottenere solo una riga per cliente?

ho guardato questo esempio, ma non ha aiutato: http: //stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns

Grazie

risposta

11

sta dando questa riga perché avete AddressID nella lista di selezione per voi subquery "P". Quindi, anche se non hai l'ID indirizzo nel tuo primo livello, seleziona questa opzione, la funzione PIVOT continua a raggruppare. È necessario cambiare questo:

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 

Anche se sarei propenso a utilizzare un esplicito INNER JOIN piuttosto che un implicito unirsi tra cliente e Indirizzo.

+0

Meraviglioso, ha funzionato! Grazie!! Non mi rendevo conto che l'addressID lo stava causando. Mi sono abituato ai join impliciti, ma inizierò a utilizzare INNER JOINs come hai menzionato. – kthiagar

+1

In questo scenario non fa molta differenza se vengono utilizzati i join impliciti o interni, e ci sono diverse discussioni sull'argomento, ad es. [Qui] (http://stackoverflow.com/questions/44917/explicit -Vs-implicita-sql-join). Il mio punto di vista personale è che i join espliciti sono più facili da leggere, consentono un più facile cambiamento tra join "INTERNI" e "ESTERNO", e riducono anche il probabile cappuccio di cross join accidentali mancando una clausola where. – GarethD

6

vorrei scrivere in questo modo invece:

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

Grazie, questo sembra un altro buon modo per farlo senza usare PIVOT. – kthiagar

Problemi correlati