Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2009, 12:02   #1
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию транспонирование строки таблицы в столбец

ADOQUERY,SQLSERVER
задача такая. В БД есть таблица с полями: data_d1_d2_d3.Пример:
---------------------
data _____|d1|d2|d3|
01.05.2009|02|03|04|
02.05.2009|05|06|07|
03.05.2009|08|09|10|
---------------------
Нужно перевернуть ее и получить таблицу с полями: data_d.Пример:
---------------
data______|d |
01.05.2009|02|
01.05.2009|03|
01.05.2009|04|
02.05.2009|05|
02.05.2009|06|
02.05.2009|07|
03.05.2009|08|
03.05.2009|09|
03.05.2009|10|
---------------
У кого какие идеи?

Последний раз редактировалось kate158; 14.05.2009 в 12:15.
kate158 вне форума Ответить с цитированием
Старый 14.05.2009, 12:14   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

подкину идею - почитай про юнионы - должно помочь
soleil@mmc вне форума Ответить с цитированием
Старый 14.05.2009, 14:21   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от soleil@mmc
подкину идею - почитай про юнионы - должно помочь
soleil@mmc, всё правильно.
А мысль не стали развивать, чтобы человек немножко подумал сам? или просто некогда (лень) дописать было?

я позволю чуть-чуть проиллюстрировать Вашу мысль:
Цитата:
задача такая. В БД есть таблица с полями: data_d1_d2_d3.Пример:
---------------------
data _____|d1|d2|d3|
Код:
select data, d1 as d from Таблица
union all
select data, d2 as d from Таблица
union all
select data, d3 as d from Таблица
where добавить по желанию/необходимости!

NB. из Вашего примера вижу, что Вы совершенно правильно обратили внимание на то, что для одной и той же строчки с data появится ТРИ строчки с этой датой...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2009, 15:23   #4
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Serge_Bliznykov, где Вы были раньше?
У меня уже появился мега код
Код:
CREATE TABLE Table (Data datetime, d1 int, d2 int,d3 int)
GO
INSERT INTO Table VALUES (1,4,3,5,4,4)
INSERT INTO Table VALUES (2,4,1,5,5,5)
INSERT INTO Table VALUES (3,4,3,5,4,4)
INSERT INTO Table VALUES (4,4,2,5,5,4)
INSERT INTO Table VALUES (5,5,1,5,5,5)
GO
--Unpivot the table.
SELECT Data, d
FROM 
   (SELECT Data, d1, d2, d3   FROM Table) t
UNPIVOT
   (Orders FOR FirstTBL IN 
      (d1, d2, d3)
)AS unpvt
GO
ну, или что - то типо этого..
а вроде бы все так просто..
kate158 вне форума Ответить с цитированием
Старый 14.05.2009, 18:54   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
soleil@mmc, всё правильно.
А мысль не стали развивать, чтобы человек немножко подумал сам? или просто некогда (лень) дописать было?
имхо решения лучше выкладывать для новичков или когда задачи монстровские (кстати, я там выложил новое решение)
похоже, топикстартер просто не читал ответы
З.Ы.: а так да - просто некогда было, надеялся хватит наводки
soleil@mmc вне форума Ответить с цитированием
Старый 15.05.2009, 16:23   #6
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Код:
select data, d1 as d from Таблица
union all
select data, d2 as d from Таблица
union all
select data, d3 as d from Таблица
where добавить по желанию/необходимости!
Все конечно хорошо, но в итоге у меня получился мега код, при выполнении ктр прога виснет где то на минуту..
kate158 вне форума Ответить с цитированием
Старый 15.05.2009, 16:32   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

вот и расскажите нам - для чего делать такое преобразование?
понятно, что такой запрос пробегает таблицу Н-раз (сколько там этих столбцов - в этом примере 3) по всем строчкам - фуллсканом
soleil@mmc вне форума Ответить с цитированием
Старый 15.05.2009, 16:41   #8
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

вах..
Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
вот и расскажите нам - для чего делать такое преобразование?
строчек у меня не три, а 24 (на каждый час). а нужно это для удобства пользователя.
может то, что есть у меня, можно как то упростить?
Код:
five.SQL.Add('select d1 as d,idobject,data, 1 as hours');
five.SQL.Add('from secondtable');
five.SQL.Add('where idobject=''Объект 1''');
five.SQL.Add('and DATA='+''''+FormatDateTime( 'dd.mm.yyyy', Present)+'''');
five.SQL.Add('union all');
five.SQL.Add('select d2 as d,idobject,data, 2 as hours');
five.SQL.Add('from secondtable');
five.SQL.Add('where DATA='+''''+FormatDateTime( 'dd.mm.yyyy', Present)+'''');
five.SQL.Add('and idobject=''Объект 1''');
five.SQL.Add('union all');
five.SQL.Add('select d3 as d,idobject,data, 3 as hours');
five.SQL.Add('from secondtable');
five.SQL.Add('where DATA='+''''+FormatDateTime( 'dd.mm.yyyy', Present)+'''');
five.SQL.Add('and idobject=''Объект 1''');
five.SQL.Add('union all');
five.SQL.Add('select d1 as d,idobject,data, 1 as hours');
five.SQL.Add('from secondtable');
five.SQL.Add('where idobject=''Объект 2''');
five.SQL.Add('and DATA='+''''+FormatDateTime( 'dd.mm.yyyy', Present)+'''');
five.SQL.Add('union all');
five.SQL.Add('select d2 as d,idobject,data, 2 as hours');
five.SQL.Add('from secondtable');
five.SQL.Add('where DATA='+''''+FormatDateTime( 'dd.mm.yyyy', Present)+'''');
five.SQL.Add('and idobject=''Объект 2''');
five.SQL.Add('union all');
five.SQL.Add('select d3 as d,idobject,data, 3 as hours');
five.SQL.Add('from secondtable');
five.SQL.Add('where DATA='+''''+FormatDateTime( 'dd.mm.yyyy', Present)+'''');
five.SQL.Add('and idobject=''Объект 2'');
А объектов всего 32.. итого получается 32*24=768 записей
kate158 вне форума Ответить с цитированием
Старый 15.05.2009, 17:03   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

вот уже какие веселые подробности открываются

вопрос заключается в том - чем юзверю будет лучше от такого разворачивания данных? что с ними дальше делать?
кстати, анпивот работает?

по-хорошему, нужно сначала ограничить набор данных, а уже потом его юнионить, а то такой запрос точно долго будет лопатить
попробуй так
Код:
with
t as
(
select *
from secondtable
where 0=0
  and DATA= :p0
  and idobject in (:p1)
)

select d1 d, idobject, data, 1 hours
from t
union all
select d2 d, idobject, data, 2 hours
from t
union all
.....
select d24 d, idobject, data, 24 hours
from t

five.SQL.ParamByName('p0').Value:= FormatDateTime( 'dd.mm.yyyy', Present);
five.SQL.ParamByName('p1').Value:= // сюда передавать список объектов
З.Ы.: а ваще-то у вас там все не через то место - айдишники и те варчарные
З.Ы.2: возможно, если там всего 32 объекта, то и вообще можно избежать фильтрования в первом запросе по айдишнику...

Последний раз редактировалось soleil@mmc; 15.05.2009 в 17:16.
soleil@mmc вне форума Ответить с цитированием
Старый 15.05.2009, 17:25   #10
kate158
Форумчанин
 
Регистрация: 01.08.2008
Сообщений: 383
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
вопрос заключается в том - чем юзверю будет лучше от такого разворачивания данных? что с ними дальше делать?кстати, анпивот работает?
юзер будет заниматься прогнозом данных. ему добавляют на сайт опр. инфу (32 объекта по каждому часу), ктр далее заносится в БД;затем юзер смотрит какая инфа была по факту и сравнивает с тем, что я пытаюсь трансформировать и по этим данным строит прогноз. фух.
анпивот не работает.
з.ы.спасибо, soleil@mmc за идеи, ты помогаешь мне думать.
в понедельник продолжу.
kate158 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка строки из таблицы Tanusha SQL, базы данных 0 16.03.2009 10:19
Вставка/импорт массива значений из текстового файла в столбец таблицы bungler Microsoft Office Excel 4 08.01.2009 19:09
Умножение строки на столбец. ReDev1L Помощь студентам 6 21.10.2008 22:31
очень срочно нужен макрос на транспонирование таблицы kievlyanin Microsoft Office Excel 10 25.06.2008 13:20
Как частично скрыть строки таблицы... krupnoff PHP 11 21.08.2007 23:49