【问题标题】:Creating Multiple Columns based on the data in a row(s)根据行中的数据创建多列
【发布时间】:2017-01-03 22:15:10
【问题描述】:

我正在尝试构建一个查询,该查询根据下面的 field_number 列创建单独的列。查询应按lead_id 分组。 form_id 是比赛(我需要能够根据我需要统计的比赛手动更改 form_id)。 field_number 每个数字代表我需要创建的一列。所以 1 = 电子邮件,4 = 名字,5 = 姓氏等等。

感谢任何有关我需要如何执行此操作的帮助。下面是我需要从中获取数据的表的示例。

    +-----+---------+---------+--------------+---------------------------------+
    | id  | lead_id | form_id | field_number | value                           |
    +-----+---------+---------+--------------+---------------------------------+
    |   1 |       1 |       3 |            1 | michael.smith@gmail.com         |
    |   2 |       1 |       3 |            4 | Michael                         |
    |   3 |       1 |       3 |            5 | Smith                           |
    |   4 |       1 |       3 |            6 | eNewsletter Sign Up Form        |
    |   5 |       2 |       3 |            1 | jack.johnson@gmail.com          |
    |   6 |       2 |       3 |            4 | Jack                            |
    |   7 |       2 |       3 |            5 | Johnson                         |
    |   8 |       2 |       3 |            6 | eNewsletter Sign Up Form        |
    |   9 |       3 |       3 |            1 | bobbie@hotmail.com              |
    |  10 |       3 |       3 |            4 | Bobbie                          |
    |  11 |       3 |       3 |            5 | DeLeon                          |
    |  12 |       3 |       3 |            6 | eNewsletter Sign Up Form        |
    |  13 |       4 |       3 |            1 | noname@gmail.com                |
    |  14 |       4 |       3 |            6 | H&H eNewsletter Sign Up Form    |
    |  15 |       5 |       3 |            1 | judybyers@hotmail.com           |
    |  16 |       5 |       3 |            4 | Judy                            |
    |  17 |       5 |       3 |            5 | Byers                           |
    |  18 |       5 |       3 |            6 | eNewsletter Sign Up Form        |
    |  19 |       6 |       3 |            1 | Andrem@yahoo.com                |
    |  20 |       6 |       3 |            4 | Andre                           |
    |  21 |       6 |       3 |            5 | M                               |
    |  22 |       6 |       3 |            6 | eNewsletter Sign Up Form        |
    |  23 |       7 |       3 |            1 | larryl@gmail.ca                 |
    |  24 |       7 |       3 |            4 | Larry                           |
    |  25 |       7 |       3 |            5 | Landerson                       |
    |  26 |       7 |       3 |            6 | eNewsletter Sign Up Form        |
    |  27 |       8 |       3 |            1 | steph@yahoo.com                 |
    |  28 |       8 |       3 |            4 | Stephanie                       |
    |  29 |       8 |       3 |            6 | eNewsletter Sign Up Form        |

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    您可以通过聚合来做到这一点:

    select lead_id, form_id,
           max(case when field_number = 1 then value end) as email,
           max(case when field_number = 4 then value end) as firstname,
           max(case when field_number = 5 then value end) as lastname
    from t
    where form_id = @form_id
    group by lead_id, form_id;
    

    这假设对于 lead_id/form_id 组合,每个字段最多出现一次。

    【讨论】:

      【解决方案2】:

      我不明白您对form_id 的要求,但是为了将行中的值转入列,查询将如下所示(我只做三个作为示例,您可以通过继续添加来添加其他值inner join 子句)

      select
          t1.lead_id
          , t1.value      as email
          , t4.value      as firstName
          , t5.value      as lastName
      from
          (
              select
                  lead_id
                  , value
              from
                  data_table
              where 
                  field_number = 1 -- email address
          ) as t1
          , inner join
          (
              select
                  lead_id
                  , value
              from
                  data_table
              where 
                  field_number = 4 -- first name
          ) as t4
              on t1.lead_id = t4.lead_id 
          , inner join
          (
              select
                  lead_id
                  , value
              from
                  data_table
              where 
                  field_number = 5 -- last name
          ) as t5
          on t1.lead_id = t5.lead_id 
      

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 2021-09-15
        • 2022-08-10
        • 1970-01-01
        • 1970-01-01
        • 2018-05-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        相关资源
        最近更新 更多