![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
преобразовать таблицу в строку [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]А почему бы на клиенте не развернуть как хочется? Некоторые генераторы отчетов такое тоже умеют самостоятельно.