【问题标题】:Combine multiple column values into new column(s) if it's a duplicate如果重复,将多个列值合并到新列中
【发布时间】:2020-11-20 22:29:28
【问题描述】:

我什至确定这是否可以完成,但我充满希望。目前使用mysql 5.7

如果它们是基于电话值的重复条目,我想显示所有列。然后我想将id号较高的所有数据选择到多个新列中。

我不知道如何创建一个可以正确显示所有重复项的视图,否则这将更容易弄清楚。我使用以下查询来获取数据。

原表

id  customer_name   customer_email   customer_phone   comments
1   Jack            jack@jack.com    111-111-1111
2   Jill            jill@jill.com    111-111-1111
3   Tim             tim@tim.com      222-222-2222
4   Tonya           tonya@tonya.com  222-222-2222

预期结果

id  customer_name   customer_email   customer_phone   spouse_name   spouse_email    comments
1   Jack            jack@jack.com    111-111-1111     Jill          jill@jill.com   Jill jill@jill.com
3   Tim             tim@tim.com      222-222-2222     Tonya         tonya@tonya.com Tonya tonya@tonya.com

理想情况下,所有 3 列都将被填充,但配偶姓名和配偶电子邮件更重要,因为我总是可以将它们组合并插入到 cmets 中。

【问题讨论】:

  • 这似乎非常冒昧。你用的是哪个世纪的?
  • @Strawberry 你有更好的推荐还是只是想粗鲁一点?

标签: mysql sql pivot inner-join aggregate-functions


【解决方案1】:

如果您运行的是 MySQL 8.0,您可以使用窗口函数和条件聚合来做到这一点:

select 
    max(case when rn = 1 then customer_name end) as customer_name_1,
    max(case when rn = 1 then customer_email end) as customer_email_1,
    customer_phone,
    max(case when rn = 2 then customer_name end) as customer_name_2,
    max(case when rn = 2 then customer_email end) as customer_email_2       
from (
    select t.*,
        row_number() over(partition by customer_phone order by id) rn
    from mytable t
) t
group by customer_phone

当两行具有相同的customer_phone 时,这会将具有最小id 的行的名称和电子邮件放在前两列中,然后是另一行的名称和电子邮件。

注意事项:

  • 如果多于两行,则忽略第二行之后的行

  • 如果只有一行,最后两列为空

  • 您的数据中没有任何内容可以将客户与“配偶”区分开来,因此我使用数字前缀代替列名

【讨论】:

  • 我应该说我正在使用 5.7 无论如何使用该版本来完成它?
  • @J.R.:在 MySQL
  • 我只是在本地运行它,它使用 8.0 可以完美运行。无论如何将 customer_name_2 和 customer_email_2 合并到一个注释列中还是需要单独查询?
猜你喜欢
  • 2022-07-07
  • 2020-12-08
  • 2015-09-03
  • 2020-05-08
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多