Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Алгоритм самосоединения таблички  [new]
АлексейАлго
Guest
Добрый день.

Есть таблица вида
ПеременнаяЗначениеКоэффициент
xy0.2
a0.51
yz2
w11
zw0.3
ba1


строки таблицы представляют собой формулы, например:
x = y*0,2
a = 0,5*1

Требуется получить конечные значения для каждой переменной, например:
x=((1w*0,3)z*2)y*0,2=0,12

Можно ли с помощью одинарного запроса получить для каждого параметра его конечное значение?
Или это невозможно и следует использовать цикличное самосоединение, пока в графе значение присутствует нечисловое значение ?
26 апр 17, 22:34    [20438057]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм самосоединения таблички  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
АлексейАлго
Можно ли с помощью одинарного запроса получить для каждого параметра его конечное значение?
Одинарным нет. Можно примерно так:
+
declare @t table (var varchar(10), val varchar(10), k float);

insert into @t
values
 ('x', 'y', 0.2),
 ('a', '0.5', 1),
 ('y', 'z', 2),
 ('w', '1', 1),
 ('z', 'w', 0.3),
 ('b', 'a', 1);

declare @q varchar(max);

with s as
(
 select
  var, val, cast('(' + isnull(cast(try_cast(val as float) as varchar(30)), quotename(val)) + ') * ' + cast(k as varchar(30)) as varchar(max)) as e, 1 as n
 from
  @t

 union all

 select
  s.var, t.val, cast(replace(s.e, quotename(s.val), a.e) as varchar(max)), s.n + 1
 from
  s join
  @t t on t.var = s.val cross apply
  (select '(' + isnull(cast(try_cast(t.val as float) as varchar(30)), quotename(t.val)) + ') * ' + cast(t.k as varchar(30))) a(e)
),
f as
(
 select top (1) with ties
  var, e
 from
  s
 order by
  row_number() over (partition by var order by n desc)
)
select
 @q = 'select var, e, val.value(''.'', ''float'') from (values (' +
  stuff((select
    ',' + '(''' + var + ''', ''' + e + ''', cast('''' as xml).query(''xs:double(' + e + ')''))'/*, 
    var, e, cast('xs:decimal(' + e + ')' as xml).value('.', 'varchar(100)'),
    cast('<a exp = "' + e + '" />' as xml).query('xs:double(a[1]/@exp)')*/
   from
    f
   for xml path(''), type). value('.', 'varchar(max)'), 1, 2, '') + ') t(var, e, val);';

exec(@q);
26 апр 17, 23:53    [20438184]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм самосоединения таблички  [new]
Rankatan
Member

Откуда:
Сообщений: 250
declare @t table (var varchar(10), val varchar(10), k float);

insert into @t
values
 ('x', 'y', 0.2),
 ('a', '0.5', 1),
 ('y', 'z', 2),
 ('w', '1', 1),
 ('z', 'w', 0.3),
 ('b', 'a', 1);

 ;with T as (
	 select var,val*k rez from @t
	 where val not in (select var from @t)

	 union all

	 select T2.var,T.rez*T2.k rez 
	 from T 
	 join @t T2
		on T.var=T2.val
 )
 select * from T
27 апр 17, 01:22    [20438229]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм самосоединения таблички  [new]
АлексейАлго
Guest
Rankatan, круто, спасибо
27 апр 17, 19:04    [20441516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить