使用MYSQL对相似的字符串进行分组

时间:2016-02-17 19:07:20

标签: 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,但仍然没有得到解决方案,对此的任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

如果您可以将搜索字符串放入表中,那么这会变得更容易一些。我不再使用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

一些注意事项:

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

如果您的搜索字符串包含在另一个搜索字符串中,则此方法将会中断。例如," Bookstores"和#34;书籍"。无论你采用什么方法,围绕这种情况进行编码将非常困难。

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

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