Это сложно. Вы можете использовать агрегацию, но вам нужно нумеровать строки:
select max(case when username = 'Bob' then uid end) as bob,
max(case when username = 'Rachel' then uid end) as Rachel,
max(case when username = 'Simon' then uid end) as Simon
from (select t.*,
row_number() over (partition by username order by uid) as seqnum
from t
) t
group by seqnum
order by seqnum;
Примечание. Это упорядочивает значения по uid
, что немного отличается от вашего набора результатов. SQL таблицы представляют неупорядоченные наборы. Порядок исходных строк отсутствует, если только в столбце не указано это упорядочение. Если у вас есть такой столбец, вы можете использовать его вместо order by uid
для row_number()
.