【问题标题】:How to aggregate based on substrings in a column?如何根据列中的子字符串进行聚合?
【发布时间】:2019-04-05 03:50:31
【问题描述】:

我正在使用如下格式的表格:

  • 号码 |国家
  • 5 |德国、美国、中国
  • 1 |德国、中国、日本
  • 4 |中国、印度、巴西
  • 3 |尼日利亚
  • 8 |巴西

我还有一张只有国家/地区的表格:

  • 国家 |
  • 德国 |
  • 中国 |
  • 巴西 |
  • 印度 |
  • 尼日利亚 |
  • 美国 |
  • 日本 |

现在我想根据国家/地区汇总 NUMBER,因此输出如下所示:

  • 国家 |总和
  • 德国 | 6
  • 中国 | 5
  • 巴西 | 12
  • 印度 | 4
  • 尼日利亚 | 3
  • 美国 | 5
  • 日本 | 1

实际的表有更多的列,每个表有 5000 多个条目。

我的逻辑是从第二个表中选择每个国家,并对第一个表的第二列进行 LIKE 并汇总匹配的数字,但我不太确定如何实现这一点。任何指导表示赞赏。

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拿起tour,环顾四周,通读Help Center,尤其是How do I ask a good question? 如果您遇到特定问题,请彻底研究,在这里彻底搜索,如果您仍然卡住,请发布您的代码和问题的描述。另外,请记住包括Minimum, Complete, Verifiable Example。人们会很乐意提供帮助
  • 尝试编写 SQL 查询以自己执行操作并发布表定义和查询结果(可能是结果中的部分行数)。以便人们能够找出问题并给出解决方案。

标签: mysql sql


【解决方案1】:

您可以使用 like 运算符加入和聚合函数 sum 以获得每个国家/地区的总数。

  SELECT C.Country, SUM(CN.Number)
  FROM Table1 CN
  INNER JOIN Table2 C ON CN.Country LIKE CONCAT('%', C.Country,'%')
  GROUP BY C.Country

【讨论】:

    【解决方案2】:

    你的数据格式很糟糕。第一个表实际上应该是一个联结/关联表。存储列表的 SQL 方式是作为表中的行,而不是逗号分隔的字符串。

    也就是说,有时我们会被其他人非常非常非常糟糕的设计决策所困扰。 MySQL 在这种情况下提供了find_set_set() 作为一个方便的函数:

    select c.country, sum(n.number)
    from countries c left join
         numbers n
         on find_in_set(c.country, replace(n.country, ', ', ',')) > 0
    group by c.country;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 2019-09-03
      • 2018-09-12
      • 2021-11-09
      • 2022-11-12
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多