SQL PIVOT для двух столбцов приводит к нулям во всех столбцах сводки - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь создать это:

Last Name, First Name, Email1, Email2, Email3, Phone1, Phone2, Phone3

Из этого запроса:

;with CTE AS (
SELECT   FirstName, LastName, Email, Phone, Zip
FROM   Mother.dbo.People
Join   Mother.dbo.PeopleEmail on People.PeopleID = PeopleEmail.PeopleEmailID
Join   Mother.dbo.PeoplePhone on People.PeopleID = PeoplePhone.PeopleID
Where Zip IN ('34201','34202','34203','34205','34207','34208')
) Select * from CTE
PIVOT
(
       MAX(Email)
       FOR Email IN (Email1, Email2, Email3)
) AS E
PIVOT
(
        MAX(Phone)
        For Phone IN (Phone1, Phone2, Phone3)
) AS P;

Однако похоже, что все мои поля «Электронная почта» и «Телефон» возвращаются нулевыми.

Для записи,

  1. Я использую SQL Server 2017
  2. Таблица «Люди» имеет имя и фамилию, и это один-ко-многим для PeopleEmail (поле электронной почты) и PeoplePhone (поле телефона).

Что мне не хватает? Спасибо!

1 Ответ

0 голосов
/ 01 сентября 2018

Вам лучше с условной агрегацией. Но вам нужно перечислить значения для их поворота:

select p.FirstName, p.LastName, Email, Phone, p.Zip
from Mother.dbo.People p join
     (select PeopleId,
             max(case when seqnum = 1 then email end) as email1,
             max(case when seqnum = 2 then email end) as email2,
             max(case when seqnum = 3 then phone end) as email3,
             max(case when seqnum = 1 then phone end) as phone1,
             max(case when seqnum = 2 then phone end) as phone2,
             max(case when seqnum = 3 then email end) as phone3
      from ((select pe.PeopleID, pe.email, null as phone,
                    row_number() over (partition by pe.PeopleID order by pe.PeopleEmailID) as seqnum
             from Mother.dbo.PeopleEmail pe
            ) union all
            (select pp.PeopleID, null as email, pp.phone,
                    row_number() over (partition by pp.PeopleID order by pp.PeoplePhoneId) as seqnum
             from Mother.dbo.PeopleEmail pe
            )
           ) em
      group by PeopleId
     ) em
     on p.PeopleID = em.PeopleEmailID
Where p.Zip IN ('34201', '34202', '34203', '34205', '34207', '34208');

EDIT:

Или вы можете сформулировать это как:

select p.FirstName, p.LastName, Email, Phone, p.Zip
       max(case when seqnum = 1 then email end) as email1,
       max(case when seqnum = 2 then email end) as email2,
       max(case when seqnum = 3 then phone end) as email3,
       max(case when seqnum = 1 then phone end) as phone1,
       max(case when seqnum = 2 then phone end) as phone2,
       max(case when seqnum = 3 then email end) as phone3
from ((select pe.PeopleID, pe.email, null as phone,
              row_number() over (partition by pe.PeopleID order by pe.PeopleEmailID) as seqnum
       from Mother.dbo.PeopleEmail pe
      ) union all
      (select pp.PeopleID, null as email, pp.phone,
              row_number() over (partition by pp.PeopleID order by pp.PeoplePhoneId) as seqnum
       from Mother.dbo.PeopleEmail pe
      )
     ) em join
     Mother.dbo.People p
     on p.PeopleID = em.PeopleEmailID
where p.Zip in ('34201', '34202', '34203', '34205', '34207', '34208');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...