вычисления в запросе

pigzi
Дата: 08.02.2013 17:43:42
Всем доброго дня!
На работе возникла следующая задача:
Есть таблица (tableX)

Счет|значение1|значение2|значение3|значение4|значение5|

Заполнено только поле "Счет", причем формат принимает 6 различных вариантов
1 счет_значение5
2 счет_значение1_значение5
3 счет_значение2_значение5
4 счет_значение3_значение5
5 счет_значение4_значение5
6 счет_значение2_значение1_значение5

необходимо заполнить остальные поля в строке соответствующими значениями

я пробовал следующим образом
declare @text varchar(32)
declare @analytics varchar(15)
declare @index int

update tableX
set @text = счет
  while
    begin
      set @index = CHARINDEX('_', @text)
      if (@index > 1)
        begin
	  INSERT INTO @analytics VALUES (LEFT(@text, @index - 1))
	  SET @text = RIGHT(@text, (LEN(@text) - @index))
	end
      if @analytics = 'значение1'
      begin
        set tableX.значение1 = @analytics
      end
      if @analytics = 'значение2'
      begin
        set tableX.значение2 = @analytics
      end
      if @analytics = 'значение3'
      begin
        set tableX.значение3 = @analytics
      end
      if @analytics = 'значение4'
      begin
        set tableX.значение4 = @analytics
      end
      if @analytics = 'значение5'
      begin
        set tableX.значение5 = @analytics
      end
    end



Не буду говорить, что не сталкивался с sql и т.д. и т.п.
В чем я не прав и куда копать
сервер 2008

Благодарю за помощь
qwerty112
Дата: 08.02.2013 18:28:15
pigzi
В чем я не прав и куда копать

http://www.sql.ru/forum/actualthread.aspx?tid=127456 п.6
pigzi
Дата: 08.02.2013 18:41:50
Имеется таблица (я ее не создавал)

Счет |значение1||значение2||значение3||значение4||значение5|

счет_значение5 Null Null Null Null Null
счет_значение1_значение5 Null Null Null Null Null
счет_значение2_значение5 Null Null Null Null Null
счет_значение3_значение5 Null Null Null Null Null
счет_значение4_значение5 Null Null Null Null Null
счет_значение2_значение1_значение5 Null Null Null Null Null

и т.д.

Требуется получить

Счет |значение1||значение2||значение3||значение4||значение5|

счет Null Null Null Null значение5
счет значение1 Null Null Null значение5
счет Null значение2 Null Null значение5
счет Null Null значение3 Null значение5
счет Null Null Null значение4 значение5
счет значение1 значение2 Null Null значение5
qwerty112
Дата: 08.02.2013 18:58:41
pigzi
Имеется таблица (я ее не создавал)

Счет значение1значение2значение3значение4значение5
счет_значение5 Null Null Null Null Null
счет_значение1_значение5 Null Null Null Null Null
счет_значение2_значение5 Null Null Null Null Null
счет_значение3_значение5 Null Null Null Null Null
счет_значение4_значение5 Null Null Null Null Null
счет_значение2_значение1_значение5 Null Null Null Null Null


и т.д.

Требуется получить

Счет значение1значение2значение3значение4значение5
счет Null Null Null Null значение5
счет значение1 Null Null Null значение5
счет Null значение2 Null Null значение5
счет Null Null значение3 Null значение5
счет Null Null Null значение4 значение5
счет значение1 значение2 Null Null значение5

про "эти данные лучше офрмлять с использованием специальных тэгов, которые повысят их читабельность" - "недошло" или "непоместилось" ?
declare @t table (id int, Счет varchar(100))

insert into @t
select 1, 'счет_значение5' union all
select 2, 'счет_значение1_значение5' union all
select 3, 'счет_значение2_значение5' union all
select 4, 'счет_значение3_значение5' union all
select 5, 'счет_значение4_значение5' union all
select 6, 'счет_значение2_значение1_значение5'

--select * from @t

;with cte as 
(select id, Счет, cast('<a>'+replace (Счет, '_', '</a><a>')+'</a>' as xml) as xz from @t)


select id, Счет, [0], [1], [2], [3], [4], [5]
from

(select t1.id, t1.Счет, t2.val, case when isnumeric(right(t2.val, 1))=1 then right(t2.val, 1) else 0 end as num
from cte t1
cross apply
	(select t.c.value('text()[1]', 'varchar(10)') as [val]
	from t1.xz.nodes('/a') as t(c))as t2) a

pivot (max(val) for num in ([0], [1], [2], [3], [4], [5])) pvt

order by 1

(6 row(s) affected)
id          Счет                                     0          1          2          3          4          5
----------- ---------------------------------------- ---------- ---------- ---------- ---------- ---------- ----------
1           счет_значение5                           счет       NULL       NULL       NULL       NULL       значение5
2           счет_значение1_значение5                 счет       значение1  NULL       NULL       NULL       значение5
3           счет_значение2_значение5                 счет       NULL       значение2  NULL       NULL       значение5
4           счет_значение3_значение5                 счет       NULL       NULL       значение3  NULL       значение5
5           счет_значение4_значение5                 счет       NULL       NULL       NULL       значение4  значение5
6           счет_значение2_значение1_значение5       счет       значение1  значение2  NULL       NULL       значение5

(6 row(s) affected)
invm
Дата: 08.02.2013 19:00:45
update tableX
 set
  [Счет] = 'Счет',
  [значение1] = case when [Счет] + '_' like '%[_]значение1[_]%' then 'значение1' end,
  [значение2] = case when [Счет] + '_' like '%[_]значение2[_]%' then 'значение2' end,
  [значение3] = case when [Счет] + '_' like '%[_]значение3[_]%' then 'значение3' end,
  [значение4] = case when [Счет] + '_' like '%[_]значение4[_]%' then 'значение4' end,
  [значение5] = case when [Счет] + '_' like '%[_]значение5[_]%' then 'значение5' end;