Это пример, который будет делать то, что вы хотите в sqlserver. Вы должны быть в состоянии приспособить его к postgres.
У меня есть две версии, одна из которых жестко кодирует сортировку, вторая использует параметр, чтобы решить, по какой сортировке.
Сначала создайте данные во временной переменной таблицы
declare @s table(id int, site_id int, asset_type int, quantity int)
insert @s values (1,1,1,10)
,(2,1,2,15)
,(3,1,3,25)
,(4,2,1,11)
,(5,2,2,16)
,(6,2,3,7)
,(7,3,1,12)
,(8,3,2,15)
,(9,3,3,16)
Первая версия с фиксированной сортировкой столбцов
select site_id,
max(case when asset_type=1 then quantity else 0 end) as q1,
max(case when asset_type=2 then quantity else 0 end) as q2,
max(case when asset_type=3 then quantity else 0 end) as q3
from @s
group by site_id
order by 2 desc
Вторая версия с сортировкой столбцов параметров
declare @assetsort int;
set @assetsort=3
select * from (
select site_id,
max(case when asset_type=1 then quantity else 0 end) as q1,
max(case when asset_type=2 then quantity else 0 end) as q2,
max(case when asset_type=3 then quantity else 0 end) as q3
from @s
group by site_id
) q
order by
case @assetsort when 1 then q1 when 2 then q2 when 3 then q3 end desc