当前位置: 首页 > 面试题库 >

将具有相同ID的行合并为一行,以保留所有数据

施权
2023-03-14
问题内容

我有一张表,上面有一些植物的记录。植物可以具有多个名称,该表将其显示为不同的记录。该表称为new_plantsname

plantid name
1       tree
1       rose
2       bush
3       tree
3       bush
3       rose

这继续超过3000条记录

我想要的是将具有相同Plantid的记录组合在一起,并在不同的列中显示不同的名称:

plantid name1 name2 name3 ...
1       tree  rose  NULL
2       shrub NULL  NULL
3       tree  rose  bush

等等

我也想将结果保存到新表中


问题答案:

基本上,这是一个PIVOT(您未指定RDBMS)我假设MySQL并且它没有PIVOT函数,因此您将需要使用带有CASE语句的聚合函数来复制它。此解决方案rownumber为每行添加一个,以便您可以确定将多少个name值转换为列。

如果您知道name要拥有多少个值,则可以对值进行硬编码:

select plantid,
  max(case when nameRn = 'name1' then name end) Name1,
  max(case when nameRn = 'name2' then name end) Name2,
  max(case when nameRn = 'name3' then name end) Name3
from
(
  select plantid, name,
      concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
      @plantid := `plantid` as dummy
  from
  (
    select plantid, name, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by plantid, overall_row_num
) src
group by plantid;

参见带有演示的SQL Fiddle

如果值的数量未知,则可以使用准备好的语句来生成此值的动态版本:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when nameRn = ''',
      nameRn,
      ''' then name end) AS ',
      nameRn
    )
  ) INTO @sql
FROM 
(
  select plantid, name,
      concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
      @plantid := `plantid` as dummy
  from
  (
    select plantid, name, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by plantid, overall_row_num
) src;


SET @sql = CONCAT('SELECT plantid, ', @sql, ' 
                  FROM 
                  (
                    select plantid, name,
                        concat(''name'', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
                        @plantid := `plantid` as dummy
                    from
                    (
                      select plantid, name, @rn:=@rn+1 overall_row_num
                      from yourtable, (SELECT @rn:=0) r
                    ) x
                    order by plantid, overall_row_num
                  ) src
                   GROUP BY plantid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

参见带有演示的SQL Fiddle

两者都会产生相同的结果:

| PLANTID | NAME1 |  NAME2 |  NAME3 |
-------------------------------------
|       1 |  tree |   rose | (null) |
|       2 |  bush | (null) | (null) |
|       3 |  tree |   bush |   rose |


 类似资料:
  • 问题内容: 我一直在在mysql数据库中的一个表上工作,该表被本地保存在wamp服务器上,我正在wamp中使用phpmyadmin区域来运行查询。我正在尝试获取数据来执行以下操作: 任何人都可以帮我建立一张带有许多工厂记录的表格。植物可以具有多个名称,该表将其显示为不同的记录。该表称为new_plantsname 持续超过3000条记录 我想要的是将具有相同plantid的记录组合在一起,并在不同

  • 问题内容: 。 我有下表: 我需要用计算所有行。可能与聚合有关吗? 现在,我按如下操作: 问题答案: 如果您只需要对1的行数进行计数,则可以执行以下操作: 如果要计算 每 行的行数,则需要使用:

  • 问题内容: 我正在尝试将具有相同ID但具有不同列值的不同行合并为一个。 例如 : 我希望将其结合起来,这样结果是: 或者 或上述内容的任何其他变体,以使行以某种方式连接在一起。 任何帮助,将不胜感激!提前致谢。 问题答案: 请先阅读我的评论-除非仅用于报告目的,否则您甚至都不要考虑这样做,并且您想了解如何在普通SQL中做到这一点(而不是使用报告的正确解决方案)工具)。 第二种格式最简单,特别是如果

  • 我有一个示例数据集,如下所示 Col1 Col2 Col3 A 1,2,3 A123 A 4,5 A456 A 1,2,3 A456 A 4,5 A123 我参考了一些解决方案,并尝试了以下方法。但它只追加单个列。

  • 我想将两个哈希数组合并到一个新数组中: 现在这就是我正在寻找的结果: 我在Ruby文档中唯一能找到的合并选项是用另一个散列覆盖重复项。那么如何才能达到我需要的版本呢?

  • 问题内容: 我有两个表,关键字和数据。 表关键字具有2列(id,关键字),表数据具有3列(id [keywords.id的外键,名称,值]。 我正在使用此查询: 它返回类似: 每个id的值可以为0到3(将来可能会更多)。 如何在同一行中检索具有相同ID的所有行? 喜欢 我想这样做是因为我希望能够对值进行排序。 问题答案: 像这样使用: 另外,您可能需要根据需要获取确切的值顺序。像这样: