Não há necessidade de um
WHILE
ciclo. SELECT
date,
id,
SUM(CASE WHEN status_id = 1 THEN status_time ELSE 0 END) AS lunch,
SUM(CASE WHEN status_id = 2 THEN status_time ELSE 0 END) AS break,
SUM(CASE WHEN status_id = 3 THEN status_time ELSE 0 END) AS vacation
FROM
My_Table
GROUP BY
date,
id
Além disso, manter o
status_time
na tabela é um erro (a menos que seja uma coluna calculada não persistente). Você está efetivamente armazenando os mesmos dados em dois lugares no banco de dados, o que acabará resultando em inconsistências. O mesmo vale para enviar esses dados para outra tabela com horários divididos por tipo de status. Não crie uma nova tabela para armazenar os dados, use a consulta para obter os dados quando precisar.