Необходимо преобразовать данные в несколько строк с одинаковым идентификатором в 1 строку с несколькими столбцами

Я рассмотрел версии своего вопроса, к которым уже обращался, но некоторые полезные советы, которые я нашел (например, используя rank() над (разделом...)), не работают в той версии Sybase, на которой я сейчас.

Я надеюсь запустить процедуру, которая извлекает данные, организованные следующим образом:

Email | предпочтение
email1 | PreferenceXYZ
email1 | PreferenceABC

И сделать это в виде таблицы следующим образом:

Email | Preference1 | Preference2
email1 | PreferenceXYZ | PreferenceABC

По сути, у меня есть несколько записей для одного и того же человека (лучше всего идентифицируемых по записи электронной почты в качестве уникального идентификатора), и я хочу зафиксировать эти несколько предпочтений для данного пользователя и создать 1 индивидуальную запись для каждого пользователя (для каждого электронного письма).

1 ответ

Решение

Если у вас есть только два предпочтения, то вы можете использовать min() а также max():

select email, min(preference) as preference1,
       (case when min(preference) <> max(preference) then max(preference) end) as preference2
from t
group by email;

РЕДАКТИРОВАТЬ:

Если у вас есть до семи значений, то используйте row_number():

select email,
       max(case when seqnum = 1 then preference end) as preference1,
       max(case when seqnum = 2 then preference end) as preference2,
       max(case when seqnum = 3 then preference end) as preference3,
       max(case when seqnum = 4 then preference end) as preference4,
       max(case when seqnum = 5 then preference end) as preference5,
       max(case when seqnum = 6 then preference end) as preference6,
       max(case when seqnum = 7 then preference end) as preference7
from (select t.*, row_number() over (partition by email order by preference) as seqnum
      from t
     ) t
group by email;

РЕДАКТИРОВАТЬ II:

Вы можете сделать это с помощью коррелированного подзапроса вместо row_number():

select email,
       max(case when seqnum = 1 then preference end) as preference1,
       max(case when seqnum = 2 then preference end) as preference2,
       max(case when seqnum = 3 then preference end) as preference3,
       max(case when seqnum = 4 then preference end) as preference4,
       max(case when seqnum = 5 then preference end) as preference5,
       max(case when seqnum = 6 then preference end) as preference6,
       max(case when seqnum = 7 then preference end) as preference7
from (select t.*,
             (select count(*)
              from t t2
              where t2.email = t.email and
                    t2.preference <= t.preference
             ) as seqnum
      from t
     ) t
group by email;
Другие вопросы по тегам