2013-12-22 3 views
0

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

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

E-mail | Домашние
EMAIL1 | PreferenceXYZ
email1 | PreferenceABC

И сделать его в виде таблицы, как в следующем:

Email | Предпочтение1 | Preference2
email1 | ПредпочтенияXYZ | 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; 

EDIT:

Если у вас есть до семи значений, а затем стержень, используя 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; 

EDIT 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; 
+0

Hello - отличная идея. Я мог бы использовать этот метод для 75% записей, но ~ 25% имеют до 7 предпочтений. Таким образом, 7 будет моим верхним пределом. – user3126487

+0

Еще раз спасибо - к сожалению, я получаю сообщение об ошибке (156) Неверный синтаксис рядом с ключевым словом 'over'. Я пробовал разные вещи. Интересно, не поддерживается ли row_number(). Спасибо за помощь .... аналитик относительно новый для сибазы здесь. – user3126487

+0

Вы должны пометить свой вопрос версией Sybase, которую используете. –

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