Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

преобразовать таблицу в строку [D5, MSSQL]


MakNik ©   (2005-05-13 10:03:00) 

... есть таблица:
IDU  Val
---  ---
1    1
1    2
2    1
2    2
2    3
...

нужно получить:
IDU  Val1  Val2  Val3
---  ---   ---   ---
1     1     2    
2     1     2     3
...

количество значений Val в результирующей таблице не больше 32
Подскажите, плз., как написать такой запрос?


MakNik   (2005-05-13 13:01:00) [1]


> sniknik ©   (13.05.05 11:56) [6]
> посмотри еще BOL по pivot table.

... спасибо, этот вариант, совместно с ф-цией exec работает в 12 раз быстрее всех рассмотренных в этой теме вариантов.


sniknik   (2005-05-13 11:56:00) [2]

посмотри еще BOL по pivot table.


stone   (2005-05-13 11:09:00) [3]

ну навертел :)) ничего не понятно... проще надо:
  declare
 @SQL  varchar(8000),
 @Val int

  set @SQL = 'select distinct IDU'

declare Cur cursor for select distinct Val from Table1  open Cur

  fetch next from Cur into @Val
  while (@@FETCH_STATUS = 0)
  begin
     set @SQL = @SQL + ',Val' + Cast(@Val as varchar(2)) + '=(select t1.Val from Table1 t1 where t1.IDU = t2.IDU and t1.Val=' +
       Cast(@Val as varchar(2)) + ')'

     fetch next from Cur into @Val
  end
  close Cur deallocate Cur

set @SQL = @SQL + ' from Table1 t2 order by IDU'

exec(@SQL)


MakNik   (2005-05-13 10:34:00) [4]

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

Declare @Tmp Table (ID_Fond uniqueIdentifier
, PlanV1 float, PlanV2 float, PlanV3 float, PlanV4 float, PlanV5 float, PlanV6 float, PlanV7 float, PlanV8 float, PlanV9 float, PlanV10 float
, PlanV11 float, PlanV12 float, PlanV13 float, PlanV14 float, PlanV15 float, PlanV16 float, PlanV17 float, PlanV18 float, PlanV19 float, PlanV20 float
, PlanV21 float, PlanV22 float, PlanV23 float, PlanV24 float, PlanV25 float, PlanV26 float, PlanV27 float, PlanV28 float, PlanV29 float, PlanV30 float
, PlanV31 float, PlanV32 float
, TabV1 float, TabV2 float, TabV3 float, TabV4 float, TabV5 float, TabV6 float, TabV7 float, TabV8 float, TabV9 float, TabV10 float
, TabV11 float, TabV12 float, TabV13 float, TabV14 float, TabV15 float, TabV16 float, TabV17 float, TabV18 float, TabV19 float, TabV20 float
, TabV21 float, TabV22 float, TabV23 float, TabV24 float, TabV25 float, TabV26 float, TabV27 float, TabV28 float, TabV29 float, TabV30 float
, TabV31 float, TabV32 float

, ID Int IDENTITY (1, 1))
Insert Into @Tmp
Select ID
, null, null, null, null, null, null, null, null, null, null
, null, null, null, null, null, null, null, null, null, null
, null, null, null, null, null, null, null, null, null, null
, null, null
, null, null, null, null, null, null, null, null, null, null
, null, null, null, null, null, null, null, null, null, null
, null, null, null, null, null, null, null, null, null, null
, null, null
from Fond

Declare @TopNo int
Declare @BotNo int
Set @TopNo=0
Set @BotNo=0
  Select top 1 @TopNo=ID from  @Tmp order by ID ASC
  Select Top 1 @BotNo=ID from  @Tmp order by ID Desc

Declare @TT Table(ID_TT int, PlanV float, TabV float, ID Int IDENTITY (1, 1))
Declare @SubTopNo int
Declare @SubBotNo int

Declare @ID_Fond UniqueIdentifier
Declare @ID_TT int
Declare @PlanV float
Declare @TabV float

DECLARE @SQLString NVARCHAR(500)

While @TopNo<=@BotNo
begin
 Select @ID_Fond=ID_Fond from @Tmp where ID=@TopNo
 Select @TopNo=@TopNo+1

 Delete from @TT

 Insert Into @TT
 Select ID,PlanV,TabV
 from TT
 Where ID_Fond=@ID_Fond
 Order by ID

 Set @SubTopNo=0
 Set @SubBotNo=0
  Select top 1 @SubTopNo=ID from  @TT  order by ID ASC
  Select Top 1 @SubBotNo=ID from  @TT  order by ID Desc

 While @SubTopNo<=@SubBotNo
 begin
   Select @ID_TT=ID_TT, @PlanV=PlanV, @TabV=TabV from  @TT where ID=@SubTopNo
   Select @SubTopNo=@SubTopNo+1

--в этом месте хотелось бы сделать что-то типа такого:
   SET @SQLString =N'Update @Tmp Set PlanV'+Convert(nvarchar(2),@ID_TT)+'='+Convert(nvarchar(5),@PlanV)+',TabV'+Convert(nvarchar(2),@ID_TT)+'='+Convert(nvarc har(5),@TabV)
   Exec (@SQLString)


 End

End
Select * from @Tmp


помогите, плз., доделать (переделать) код до работоспособного!


Anatoly Podgoretsky   (2005-05-13 10:15:00) [5]

Хранимая процедура


stone   (2005-05-13 10:10:00) [6]

Такой запрос нужно строить динамически, в цикле формировать строку запроса. Это можно сделать как на клиентской части, так и оформить на сервере в качестве процедуры.


Sergey13   (2005-05-13 10:07:00) [7]

А почему бы на клиенте не развернуть как хочется? Некоторые генераторы отчетов такое тоже умеют самостоятельно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо