crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> FireBird: как преобразовать строки в столбцы?
Litkevich Yuriy
  опции профиля:
сообщение 18.12.2008, 15:44
Сообщение #1


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

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

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




Репутация:   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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 19.12.2008, 15:01
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


В Firebird процедура должна возвращать фиксированное количество столбцов.
На версии 2.1
Можно извернутся с помощью EXECUTE STAIMENT + EXECUTE BLOCK + GTT но мне кажется это ужасный изврат.

Не проще ли выдернуть все данные на клиента и там извращаться?

П.С. В MS SQL & ORACL есть специальная конструкция PIVOT. Я не в курсе насчёт её стандартности.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.12.2008, 17:26
Сообщение #3


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

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

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




Репутация:   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 столбцов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 22.12.2008, 11:27
Сообщение #4


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

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




Репутация:   -1  


да вы батенька, извращенец!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.12.2008, 14:53
Сообщение #5


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

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

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




Репутация:   94  


kuler, а на более умную фразу знаний наскребешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 22.12.2008, 16:21
Сообщение #6


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

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




Репутация:   -1  


ну а если бы там было не 23 а 1023?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.12.2008, 16:49
Сообщение #7


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

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

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




Репутация:   94  


Цитата(kuler @ 22.12.2008, 19:21) *
ну а если бы там было не 23 а 1023?
а я везучий ;)

А у тебя варианты есть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 22.12.2008, 18:31
Сообщение #8


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

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




Репутация:   -1  


возвращать
A
val1
...
valn
A+1
val1
...
valn
...

преобразование на стороне клиента будет простейшим

короче врядли sql предназначен для вывода большого множества столбцов а уж тем более переменного, это использование не по назначению. СУБД это не оперативная память где как хочешь измерения фигаришь
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.12.2008, 18:41
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(kuler)
преобразование на стороне клиента будет простейшим

короче врядли sql предназначен для вывода большого множества столбцов а уж тем более переменного, это использование не по назначению. СУБД это не оперативная память где как хочешь измерения фигаришь

Покажи, пожалуйста, это преобразование на стороне клиента! Самому интересно увидеть решение! :) Буду благодарен, если откликнешься и напишешь код преобразования! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 22.12.2008, 18:51
Сообщение #10


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

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




Репутация:   -1  


Цитата(AD @ 22.12.2008, 18:41) *
Покажи, пожалуйста, это преобразование на стороне клиента! Самому интересно увидеть решение! :) Буду благодарен, если откликнешься и напишешь код преобразования!

ну дык смотря какое нада, в данном случае я так понимаю надо будет из одного столбца расфасовать по нескольким столбцам? а конкретно во что пихать то нада?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 21.6.2018, 9:15