Всем привет, приходится знакомится с 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
Если все же хотите сделать транспонирование на стороне сервера, то рекомендую создать 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
Vitalts можешь скинуть более подробно как использовать этот код, мне это нужно сделать из делфы, я не совсем понимаю лексику как это должно выглядеть на pascal, может несколько строк примера дашь, c exel опыта работы немного, сделал выгрузку,привел к требуемому виду а вот как транспонировать ее с помощью кода пока не понимаю.
Спасибо.
Вопрос решен
Вопрос решен, Спасибо.