下面是表中记录的快照,并希望从此
转移| 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”。我正在研究一些线程,如link1和link2,但仍然没有得到解决方案,对此的任何帮助都将非常感激。
答案 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;书籍"。无论你采用什么方法,围绕这种情况进行编码将非常困难。
搜索表只是一个列表,其中包含构成您的组的字符串。
COALESCE
和LEFT OUTER JOIN
用于处理您拥有不属于任何群组的数据行的情况。他们将作为自己的团体出现。要删除这些内容,只需删除COALESCE
并将LEFT OUTER JOIN
更改为INNER JOIN
。