Sql 需要将具有相同ID的多行数据转换为具有多列的一行

Sql 需要将具有相同ID的多行数据转换为具有多列的一行,sql,sybase,records,unify,Sql,Sybase,Records,Unify,我回顾了我的问题已经解决的版本,但我发现使用“排名高于分区”的一些好技巧。。。例如,在我使用的Sybase版本中似乎不起作用 我希望运行一个程序来提取按如下方式组织的数据: 电子邮件|首选项 电子邮件1 |首选项XYZ 电子邮件1 |首选项ABC 并将其呈现在如下表中: 电子邮件|首选项1 |首选项2 电子邮件1 |首选项XYZ |首选项ABC 本质上,我有同一个人的多个记录,最好通过电子邮件记录作为唯一标识符来识别,我想为给定用户捕获这些多个首选项,并为每个用户每封电子邮件创建一个单独的记录。

我回顾了我的问题已经解决的版本,但我发现使用“排名高于分区”的一些好技巧。。。例如,在我使用的Sybase版本中似乎不起作用

我希望运行一个程序来提取按如下方式组织的数据:

电子邮件|首选项 电子邮件1 |首选项XYZ 电子邮件1 |首选项ABC

并将其呈现在如下表中:

电子邮件|首选项1 |首选项2 电子邮件1 |首选项XYZ |首选项ABC


本质上,我有同一个人的多个记录,最好通过电子邮件记录作为唯一标识符来识别,我想为给定用户捕获这些多个首选项,并为每个用户每封电子邮件创建一个单独的记录。

如果您只有两个首选项,那么您可以使用最小和最大:

编辑二:

实际上,您可以使用相关子查询而不是行号来执行此操作:


你好-好主意。我可以对75%的记录使用这种方法,但约25%的记录有多达7种偏好。所以7将是我的上限。再次感谢-不幸的是,我在关键字“over”附近收到错误语法156。我试过各种类似的方法。我想知道行号是否也不受支持。谢谢你的帮助……这里是sybase的新手。你应该用你正在使用的sybase版本来标记你的问题。谢谢-我本来应该这样做的。Adaptive Server Enterprise/15.0.3/EBF 20621 ESD4.2/P/RS6000/AIX 5.3/ase1503/2814/64位/FBO/Sat Dec 8 09:18:36 2012非常感谢Gordon—这非常有效。我意识到我需要包含一个日期字段,并选择记录的时间戳,该时间戳是最多7个首选项中的最高值,并包含在行->电子邮件、日期、pref1、pref2、pref3等中。谢谢!
select email, min(preference) as preference1,
       (case when min(preference) <> max(preference) then max(preference) end) as preference2
from t
group by email;
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;
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;