mysql - 使用 MYSQL 对相似的字符串进行分组以收集

标签 mysql sql database group-by

下面是表中记录的快照,并希望从中传输

| Date     | Column1| Column2 | Column3
---------------------------------------
| 2016-01  | 10 HOME| X       | 20
| 2016-01  | HOME   | X       | 30
| 2016-01  | HOME,CA| X       | 30
| 2016-01  | PRES,TX| X       | 100
| 2016-01  | PRES,01| X       | 70
| 2016-01  | 40 PRES| X       | 30
| 2016-01  | FACTO  | X       | 10
| 2016-01  | FACTO,M| X       | 30

到此

| Date     | Column1| Column2 | Column3
---------------------------------------
| 2016-01  | HOME   | X       | 80
| 2016-01  | PRES   | X       | 200
| 2016-01  | FACTO  | X       | 40

相似字符串被分组到的所需字符串的集合是固定的,例如在本例中它是集合{“HOME”,“PRES”,“FACTO”}。要求是将所有看起来相似的字符串分组为一个,即字符串“10 HOME”、“HOME”和“HOME,CA”在组结果表中仅作为“HOME”。我正在研究一些线程,如 link1link2但仍然没有得到解决方案,对此的任何帮助将不胜感激。

最佳答案

如果您可以将搜索字符串放入表格中,那么这会变得更容易一些。我不再使用 MySQL,所以我不记得有什么可用的表值参数、临时表或数组,但类似下面的东西可以工作:

SELECT
    MT.some_date,
    COALESCE(ST.search_string, MT.column_1) AS my_group,
    MT.column_2,
    SUM(MT.column_3)
FROM
    My_Table MT
LEFT OUTER JOIN Search_Table ST ON MT.column_1 LIKE '%' + ST.search_string + '%'
GROUP BY
    MT.some_date,
    COALESCE(ST.search_string, MT.column_1) AS my_group,
    MT.column_2

一些注意事项:

您需要实际使用描述性列名称。我希望上面的列名称仅用于示例。

如果您的搜索字符串包含在另一个搜索字符串中,则此方法将失败。例如,“书店”和“书籍”。我认为,无论您采用哪种方法,围绕这种情况进行编码都将非常困难。

搜索表只是一个单列表,其中包含构成您的组的字符串。

COALESCELEFT OUTER JOIN 用于处理数据行不属于任何组的情况。他们将作为自己的团体出现。要消除这些问题,只需删除 COALESCE 并将 LEFT OUTER JOIN 更改为 INNER JOIN

关于mysql - 使用 MYSQL 对相似的字符串进行分组以收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35465518/

相关文章:

mysql - 当总行数 < n 时取出 n 行

mysql - 重命名 MySQL 上的主键约束

php - CakePHP:无法识别 hasMany 关联

java - 在表或类似的表中使用两个主键

database - 无法启动 mySQL 服务器 Windows 8

php - 存储查询结果以供以后在 session 或临时表或查询中一一使用?

mysql - 在 MySQL 表中插入缺失值

MySQL 变量替换

mysql - 一张表中的复杂 SQL 查询

python - 使用 loc 替换/选择列中的值。 Pandas