Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

преобразовать таблицу в строку   Найти похожие ветки 

 
MakNik   (2005-05-13 10:03) [0]

... есть таблица:
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
Подскажите, плз., как написать такой запрос?


 
Sergey13 ©   (2005-05-13 10:07) [1]

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


 
stone ©   (2005-05-13 10:10) [2]

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


 
Anatoly Podgoretsky ©   (2005-05-13 10:15) [3]

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


 
MakNik   (2005-05-13 10:34) [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


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


 
stone ©   (2005-05-13 11:09) [5]

ну навертел :)) ничего не понятно... проще надо:
  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)


 
sniknik ©   (2005-05-13 11:56) [6]

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


 
MakNik   (2005-05-13 13:01) [7]


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.04 c
1-1118319200
john_mag
2005-06-09 16:13
2005.06.29
OnClose


3-1116587396
tyo
2005-05-20 15:09
2005.06.29
EConvertError в TDBGrid


1-1118271217
Rico
2005-06-09 02:53
2005.06.29
Исключения


14-1117478658
Ермак
2005-05-30 22:44
2005.06.29
Срочно! О принтере HP IIP


4-1115450526
hwmaster
2005-05-07 11:22
2005.06.29
как проверить сколько свободного места осталось в оперативке ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский