crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> FireBird: как преобразовать строки в столбцы?
Litkevich Yuriy
  опции профиля:
сообщение 18.12.2008, 15:44
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Никак не дается мне одна задачка, может кто-нибудь направит на путь истинный (хотябы даже мысли в слух).

Дано:
Хранимая Процедура (ХП) выбора FooProc(id INTEGER)
возвращает набор данных (N строк) из одного столбца для заданного id
Value
-------
value1
value2
...
valueN


Задача:
Сделать ХП MyProc(A INTEGER, B INTEGER) возвращаеющую набор данных (M строк) из N столбцов (по числу строк первой) плюс id в диаппазоне от A до B
т.е.:
ID    | Value1 | Value2 |... | ValueN
------------------------------------------
A     |value1  |value2  |... | valueN
A+1   |value1  |value2  |... | valueN
...
B     |value1  |value2  |... | valueN


где N - фиксированное целое число


----
FireBird 2.0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 19.12.2008, 17:26
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 19.12.2008, 18:01) *
Не проще ли выдернуть все данные на клиента и там извращаться?
да вот на клиенте хотелось простоты, QSqlQueryModel + QTableView

Сделал посредством двух процедур. Одна делает из столбца строку, а вторая делает нужное кол-во строк.
вот так работает первая:
    FOR select
         Sum(case when p.TID = '0' then p.PWR end),
         Sum(case when p.TID = '1' then p.PWR end),
         Sum(case when p.TID = '2' then p.PWR end),
         Sum(case when p.TID = '3' then p.PWR end),
         Sum(case when p.TID = '4' then p.PWR end),
         Sum(case when p.TID = '5' then p.PWR end),
         Sum(case when p.TID = '6' then p.PWR end),
         Sum(case when p.TID = '7' then p.PWR end),
         Sum(case when p.TID = '8' then p.PWR end),
         Sum(case when p.TID = '9' then p.PWR end),
         Sum(case when p.TID = '10' then p.PWR end),
         Sum(case when p.TID = '11' then p.PWR end),
         Sum(case when p.TID = '12' then p.PWR end),
         Sum(case when p.TID = '13' then p.PWR end),
         Sum(case when p.TID = '14' then p.PWR end),
         Sum(case when p.TID = '15' then p.PWR end),
         Sum(case when p.TID = '16' then p.PWR end),
         Sum(case when p.TID = '17' then p.PWR end),
         Sum(case when p.TID = '18' then p.PWR end),
         Sum(case when p.TID = '19' then p.PWR end),
         Sum(case when p.TID = '20' then p.PWR end),
         Sum(case when p.TID = '21' then p.PWR end),
         Sum(case when p.TID = '22' then p.PWR end),
         Sum(case when p.TID = '23' then p.PWR end)
    from P_HOURLYPWR(:pointid, :indate) p
    INTO :f00, :f01, :f02, :f03, :f04, :f05, :f06, :f07, :f08, :f09, :f10, :f11, :f12, :f13, :f14, :f15, :f16, :f17, :f18, :f19, :f20, :f21, :f22, :f23
...


если не писать Sum то исходная таблица (содержащая один столбец) превращается в диагональную матрицу, в которой по диагонали размещаются значения исходной. Ну а с помощью Sum(case...) получаем строку из N столбцов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.2.2025, 7:37