Listing incident categories I have a need to keep a list of incidents and then assign root cause reasons from a few different static lists.

I'm using MySQL at the moment and the layout I have is as follows:

+----+---------+----------------+----------------+-------+----------------------+----------------+-------------+---------------------+---------------------+
| id | case_id | categories1    | categories2    | notes | reps                 | created_by     | modified_by | created             | modified            |
+----+---------+----------------+----------------+-------+----------------------+----------------+-------------+---------------------+---------------------+
| 45 |    3640 | 10,28          | 3,6,8          | NULL  | person1,person2      | admin          | admin       | 2017-02-15 16:49:42 | 2017-02-20 12:22:18 |
| 46 |    3641 | 2,22,10,29     | 2,3            | NULL  | NULL                 | admin          | admin       | 2017-02-16 10:46:40 | 2017-02-20 16:53:28 |
| 47 |    3642 | 9,10,28        | 1,2            | NULL  | NULL                 | admin          | admin       | 2017-02-16 12:04:24 | 2017-02-22 14:29:14 |
| 48 |    3643 | 39,40,10,37,31 | 8              | NULL  | NULL                 | admin          | admin       | 2017-02-16 12:41:53 | 2017-03-06 14:55:10 |


From what I've read on database design, having the records as comma separated values isn't considered best practice. Taking into consideration that the reports run on these records will be only dealing with a couple of thousand records at any time, is it worth changing the table? If so, can someone give me a suggestion as to a better layout or point me in the right direction?
The usual design is to relocate each column with repeating values into its own table.

You don't say, but I'll call your current table Incidents, and I'll assume the Id is the primary key.

Next create a table for each repeating-value column and link them back to Incidents. For example

IncidentCategories1
  IncidentId
  CategoryID


Values will be (45, 10), (45, 28), (46, 2), (46, 22) etc. Similarly with IncidentCategories2. Reps column becomes

IncidentReps
  IncidentId
  RepName


with values (45, person1), (45, person2) etc. And and so on for the other columns with repeating values.

As for your question about whether it is worth it, well, that's quite subjective. You are using a relational database. The assumption is data is normalised. Your current design isn't. It makes sense to give the tool what it expects to receive, unless there are overwhelming reasons to do otherwise. The only one I can think of is that you only ever treat those repeating groups as a whole and never parse them (in SQL). In that case they can be considered strings that just happen to have commas at certain positions. For this your current design is fine.