Транспонирование строк в столбцы

Всем привет, приходится знакомится с PostgreSql и сразу с довольно таки интересным заданием.
Есть select, который возвращает порядка 300-400 строк, эти данные нужно транспонировать в столбцы.
Подскажите как это можно сделать, писать 300-400 case-ов как то не хочется, может кто уже сталкивался с такой задачей??
Мне кажется что это должна быть ф-ия, которая вернет мне уже транспонированный вариант.
Спасибо.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

В случае попытки осуществить

В случае попытки осуществить желаемой при помощи функции, вам потребуется функци, возвращая SETOF record. Функции, возвращающие набор записей требует при обращении указывать тип возвращаемых клонок, т.е. в ващем случае обращение к функции будет похоже на:
SELECT* FROM transpose('input_table') AS t(t1 text, t2 text, t3 text, ..., t399 text, t400 text)
Оно вам надо? Мой совет, откажитесь от этой затеи.
Также, возврат табличных данных от СУБД означает, что все значения в столбце имеют один тип данных. До транспонирования также значения в колонках были одного типа -> все значения в искомом наборе должны быть одного типа, если это не так, то нужно будет делать приведение типов.
Таблица в СУБД подрузомевает конечное число столбцов и не ограниченное число строк, транспонирование ломает эту логику, т.е. противоречит СУБД.

Подобные преобразования корректнее и проще делать на стороне клиента.

Сейчас так и есть, в Faste с

Сейчас так и есть, в Faste с помощью вертикальных бэндов строю отчет потом экспорт в exel делаю, но это работает медленно, пользователи хотят быстрее, нашел на форуме что есть компонент для delphi nxDBGrid, который позволяет данные транспонировать, но нигде найти не могу, еще вариант в самом exel попробовать(такая поддержка в exel есть), пока кодом не знаю как это сделать.

В Excel Paste Special c

В Excel Paste Special c галкой transpose

Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= False, Transpose:=True

Если все же хотите сделать транспонирование на стороне сервера, то рекомендую создать View. Набрасать нужные case в Excel не составит огромного труда, однако выборка вида
SELECT * FROM view_traspose_input_table
имеет перед
SELECT * FROM transpose_input_table() AS t(t1 text, t2 text, t3 text, ..., t399 text, t400 text)
несравненное преимущество.

Спасибо за помощь, буду

Спасибо за помощь, буду пробовать.

Selection.PasteSpecial

Selection.PasteSpecial Paste:=xlPasteAll,Operation:=xlNone, SkipBlanks:=False,Transpose:=True

Vitalts можешь скинуть более подробно как использовать этот код, мне это нужно сделать из делфы, я не совсем понимаю лексику как это должно выглядеть на pascal, может несколько строк примера дашь, c exel опыта работы немного, сделал выгрузку,привел к требуемому виду а вот как транспонировать ее с помощью кода пока не понимаю.
Спасибо.

Вопрос решен

Вопрос решен, Спасибо.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023