Използвайте crosstab()
от допълнителния модул tablefunc.
Специфичната трудност ето, че "име на ред" се състои от две колони. Конкатенирам за целите на заявката и не показвам свързаната колона в края.
Приемаме fn
и ln
са NOT NULL
. Нетествано:
SELECT fn, ln, cat1, cat2
FROM crosstab(
'SELECT fn || ln AS row_name, fn, ln, file_type, attribute
FROM t
ORDER BY fn, ln, file_type'
,$$VALUES ('cat1'::text), ('cat2')$$)
AS t (row_name text, fn text, ln int, cat1 text, cat2 text);
Друг вариант би бил да добавите сурогатно "име на ред" с функция на прозорец като dense_rank()
и третирайте дефиниращите две колони като "допълнителни колони". Пример:
- Postgresql кръстосана заявка с множество колони „име на ред“
Основи:
- PostgreSQL Crosstab Query