Non c'è bisogno di un 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
Inoltre, mantenendo lo status_time
nella tabella è un errore (a meno che non sia una colonna calcolata non persistente). Stai effettivamente archiviando gli stessi dati in due posizioni nel database, il che finirà per causare incoerenze. Lo stesso vale per il push di questi dati in un'altra tabella con tempi suddivisi per tipo di stato. Non creare una nuova tabella per contenere i dati, usa la query per ottenere i dati quando ne hai bisogno.