Você pode usar abaixo "técnica"
Primeira consulta #1. Ele produz a consulta (consulta #2) que você precisa executar para obter o resultado que você precisa. Por favor, ainda considere os comentários de Mosha antes de ficar "selvagem" com milhares de categorias :o)
Consulta nº 1:
SELECT 'select UserID, ' +
GROUP_CONCAT_UNQUOTED(
'sum(if(category = "' + STRING(category) + '", 1, 0)) as ' + STRING(category)
)
+ ' from YourTable group by UserID'
FROM (
SELECT category
FROM YourTable
GROUP BY category
)
O resultado será como abaixo - Consulta #2
SELECT
UserID,
SUM(IF(category = "A", 1, 0)) AS A,
SUM(IF(category = "B", 1, 0)) AS B,
SUM(IF(category = "C", 1, 0)) AS C
FROM
YourTable
GROUP BY
UserID
é claro para três categorias - você pode fazê-lo manualmente, mas para milhares definitivamente fará dia para você!
O resultado da consulta nº 2 terá a aparência esperada:
UserID A B C
1 1 1 0
2 0 0 1
3 1 1 1