【问题标题】:SQL merge numerous rows into one single row using unique keySQL使用唯一键将多行合并为一行
【发布时间】:2021-07-24 10:37:07
【问题描述】:

我的表(用户)中有类似这样的数据如您所见,user_id 9 已用某些元数据填充了许多行。该用户的 user_id 记录了 39 个不同的 meta_values,共 39 行。

user_id meta_key meta_value
9 first_name Gilda
9 last_name Lilia
9 Email test@test.com

我真的很想转换数据,使输出看起来像这样。

user_id first_name last_name
9 Gilda Lilia

还有电子邮件,但我不知道如何在上表中显示。

在这个阶段,我有超过 3600 个唯一用户,平均每个用户大约有 40 行。我希望能够根据需要向单行添加不同的元值,所以真的只是为初始查询寻找一些帮助。

非常感谢您的帮助。

【问题讨论】:

  • 将是一个支点。 See this.
  • @PaulT。对,就是那样。然而,我刚刚学到了一个新东西。谢谢
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql pivot


【解决方案1】:

以下查询对我有帮助。在这里,我将表名命名为 temp_user,您需要更改。

select [user_id],first_name, last_name, Email
from
(
  select [user_id],meta_key, meta_value
  from temp_user
) d
pivot
(
  MAX(meta_value)
  for meta_key in (first_name, last_name , Email)
) piv;

【讨论】:

    【解决方案2】:

    在你的数据库中创建一个表添加 4 行(这里你想创建多少就创建多少)

    1st row usersID 
    2nd row firstname
    3rd row lastname
    And 4th row called email
    

    进入你的编辑器
    现在连接您的数据库插入值
    像这样 *INSERT INTO your table name(userId, firstname, lastname, email) VALUES (从你的表单 HTML 或 PHP 添加值)

    【讨论】:

      【解决方案3】:

      我会推荐条件聚合:

      select user_id,
             max(case when meta_key = 'first_name' then meta_value end)as first_name,
             max(case when meta_key = 'last_name' then meta_value end)as last_name,
             max(case when meta_key = 'email' then meta_value end)as email
      from t
      group by user_id;
      

      如果您想将所有 39 个键作为列,您只需将其扩展为具有 39 个 max(case) 表达式。

      【讨论】:

        猜你喜欢
        • 2014-09-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        相关资源
        最近更新 更多