Вопрос по sql, pivot – SQL Pivot со строкой

11

У меня есть две таблицы в SQL Server: клиент и адрес

Customer Table:

<code>CustomerID  FirstName  LastName
----------- ---------- ----------
1           Andrew     Jackson         
2           George     Washington
</code>

Address Table:

<code>AddressID   CustomerID  AddressType City
----------- ----------- ----------- ----------
1           1           Home        Waxhaw     
2           1           Office      Nashville    
3           2           Home        Philadelphia
</code>

Это вывод, который мне нужен:

<code>CustomerID  Firstname  HomeCity      OfficeCity
----------- ---------- ----------    ----------
1           Andrew     Waxhaw        Nashville
2           George     Philadelphia  Null
</code>

Это мой запрос, но не получается правильный результат:

<code>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
</code>

Это результат, который я получаю:

<code>CustomerID  Firstname  HomeCity      OfficeCity
----------- ---------- ----------    ----------
1           Andrew     Waxhaw        NULL
1           Andrew     NULL          Nashville
2           George     Philadelphia  Null
</code>

Как вы можете видеть, Клиент 1 дважды появляется в конечном результате. Можно ли получить только один ряд на одного клиента?

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

Спасибо

Ваш Ответ

2   ответа
14

AddressID в списке выбора для вас подзапрос & quot; P & quot ;. Таким образом, даже если у вас нет 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 а не неявное соединение между клиентом и адресом.

Замечательно, что сработало! Спасибо!! Я не понял, что это вызвал addressID. Я привык к неявным объединениям, но я начну использовать ВНУТРЕННИЕ СОЕДИНЕНИЯ, как вы упомянули. kthiagar
В этом сценарии не имеет большого значения, используются ли неявные или внутренние объединения, и существует множество различных дискуссий по этому вопросу, например,here, Мое личное мнение состоит в том, что явные объединения легче читать, они позволяют легче переключаться между объединениями 'INNER` и' OUTER`, а также уменьшают вероятность случайных перекрестных объединений, пропуская предложение where.
8

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'
Спасибо, это похоже на еще один хороший способ сделать это без использования PIVOT. kthiagar

Похожие вопросы