【问题标题】:need to convert data in multiple rows with same ID into 1 row with multiple columns需要将具有相同ID的多行数据转换为1行多列
【发布时间】:2014-01-10 15:26:55
【问题描述】:

我查看了已解决的问题的版本,但我发现的一些好技巧(例如使用 rank() over (partition...))似乎不适用于我使用的 Sybase 版本。

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

电子邮件 |偏好
电子邮件1 |偏好XYZ
电子邮件1 |偏好ABC

并将其呈现在如下表格中:

电子邮件 |偏好1 |偏好2
电子邮件1 |偏好XYZ |偏好ABC

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

【问题讨论】:

    标签: sql sybase records unify


    【解决方案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;
    

    【讨论】:

    • 你好——好主意。我可以将这种方法用于 75% 的记录,但约 25% 有多达 7 个偏好。所以 7 是我的上限。
    • 再次感谢 - 不幸的是,我在关键字“over”附近收到错误 (156) 语法错误。我已经尝试过各种各样的事情。我想知道是否也不支持 row_number() 。感谢您的帮助....这里的 sybase 分析师相对较新。
    • 您应该使用您正在使用的 Sybase 版本标记您的问题。
    • 谢谢你——我一开始就应该这样做。 Adaptive Server Enterprise/15.0.3/EBF 20621 ESD#4.2/P/RS6000/AIX 5.3/ase1503/2814/64-bit/FBO/2012 年 12 月 8 日星期六 09:18:36
    • 非常感谢 Gordon —— 这工作很费钱。我意识到我需要包含一个日期字段,并选择最多 7 个首选项中“最高”的记录时间戳并包含在行中 --> 电子邮件、日期、首选项 1、首选项 2、首选项 3 等。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2019-07-28
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多