If you look at the audit trail / history tab on the ticket can you see the action that you want to report on in here? It won't specifically show that the category was changed but should show there was an update after SA created the ticket? If so, then your best bet is to link to the audit trail table and use Crystal reports. Here's an article from Stu on how this data is stored:
As the audit trail table holds the history of all your tickets it can be pretty huge, it might be an idea to write a sql view so that the audit trial only for the ticket you are currently reporting on gets picked up each time you run the report.
Once you've got the audit trial linked in the report then you can look for the minimum row based on date which was not linked to the SA user?
The neater solution might be if you had a manual action within your process called "categorise ticket" and this brought up a new window off the ticket which allowed you to categorise the ticket and wrote the value back to the main ticket window. In this way you could store a creation user and creation date for the "categorise ticket" object and it would make reporting easier. This is just an idea and you might decide that it would be easier to report with what you've got rather than do some process design but I thought I'd mention it as an idea that you might want to consider.
Thank you Karen and Stu.
The audit trail idea and the code snippet are exactly what I needed!