2012-04-25 7 views
6

У меня есть две таблицы в SQL Server: Customer и адресSQL Pivot с Последовательностью

клиентов Таблица:

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 показывает дважды в конечный результат. Можно ли получить только одну строку на одного клиента?

Я посмотрел этот пример, но не помогло: HTTP: //stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns

Благодарности

ответ

11

это дает эту строку, потому что у вас есть 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 JOIN, а не неявное соединение между клиентом и адресом.

+0

Замечательно, что сработало! Благодаря!! Я не понимал, что addressID вызывает это. Я привык к неявным объединениям, но я начну использовать INNER JOINs, как вы уже упоминали. – kthiagar

+1

В этом случае не имеет большого значения, используются ли неявные или внутренние соединения, и есть несколько разных обсуждений по теме, например [здесь] (http://stackoverflow.com/questions/44917/explicit -vs-неявная SQL-соединение). Мое личное мнение состоит в том, что явные соединения легче читать, позволяя упростить изменение между объединениями «INNER» и «OUTER», а также уменьшить вероятность случайного перекрестного соединения из-за отсутствия предложения where. – GarethD

6

Я хотел бы написать это вместо того, чтобы:

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

Спасибо, это выглядит как хороший способ сделать это, не используя PIVOT. – kthiagar

Смежные вопросы