2013-12-22 45 views
0

我已回答了我的问题的已回顾版本,但是我发现了一些很好的提示(例如使用rank()over(partition ...) ,似乎并没有在Sybase版本,我在上班需要将具有相同ID的多个行中的数据转换为具有多个列的1行

我希望能运行如下拉动组织数据的过程:

电子邮件|偏好
EMAIL1 | PreferenceXYZ
email1 | PreferenceABC

,呈现在一个表如下所示:

电子邮件|偏好1 | 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; 

编辑二:

你其实可以与相关子查询,而不是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

你好 - 伟大的想法。我可以在75%的记录中使用这种方法,但约25%的记录有多达7种偏好。所以7是我的上限。 – user3126487

+0

再次感谢 - 不幸的是我收到错误(156)关键字'over'附近的语法不正确。我曾尝试过各种各样的事情。我想知道row_number()是否也不被支持。感谢您的帮助....分析师对于sybase而言相对较新。 – user3126487

+0

您应该用您正在使用的Sybase版本标记您的问题。 –

相关问题