Dopo lungo peregrinare son riuscito a trovare la query che mi serviva. Non è che l'abbia capita
tutta ma funziona a meraviglia.
Sull'esempio che ho postato sarebbe così.

codice:
select max(case when posizione='Amministrativo'
           then cognome else '' end) as Amministativi,
       max(case when posizione='Capo Reparto'
           then cognome else '' end) as Capi_Reparto,
       max(case when posizione='Commesso'
           then cognome else '' end) as Commessi,
       max(case when posizione='Magazziniere'
           then cognome else '' end) as Magazzinieri
from (
  select e.posizione,
         e.cognome,
         (select count(*) from impiegati d
           where e.posizione=d.posizione and e.id < d.id) as rnk
    from impiegati e
         ) x 
   group by rnk
Edit. Ho ancora un problemino.
Non riesco a ottenere i risultati ordinati per cognome. Ovunque metta l'order o mi restituisce errore oppure se ne infischia.