如何基于列中的子字符串进行汇总?

时间:2019-04-05 03:50:32

标签: mysql sql

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

  • NUMBER |国家/地区
  • 5 |德国,美国,中国
  • 1 |德国,中国,日本
  • 4 |中国,印度,巴西
  • 3 |尼日利亚
  • 8 |巴西

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

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

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

  • COUNTRY | SUM
  • 德国| 6 <5 + 1>
  • 中国| 5 <1 + 4>
  • 巴西| 12
  • 印度| 4
  • 尼日利亚| 3
  • 我们| 5
  • 日本| 1

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

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

2 个答案:

答案 0 :(得分:0)

您可以使用like运算符来加入和汇总函数总和以获取每个国家/地区的总和。

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

答案 1 :(得分:0)

您的数据格式很糟糕。第一个表实际上应该是联结/关联表。 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;