No hay necesidad de un WHILE
bucle.
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
Además, manteniendo el status_time
en la tabla es un error (a menos que sea una columna calculada no persistente). Está almacenando efectivamente los mismos datos en dos lugares en la base de datos, lo que terminará generando inconsistencias. Lo mismo ocurre con la inserción de estos datos en otra tabla con tiempos desglosados por tipo de estado. No cree una nueva tabla para almacenar los datos, utilice la consulta para obtener los datos cuando los necesite.