рассчитать по формулам состоят из одной строки и разделены специальным символом

Обновить

April 2019

Просмотры

11 раз

0

Тест DDL

with cte as (
    select '0001' ID,1 InputValue,'Qty*2;Qty*5' Formulas union all
    select '0002' ID,2 InputValue,'Qty+4;Qty/5' Formulas 
)
select * into T from cte

--Query Data
ID      ,InputValue ,Formulas       
0001    ,1          ,Qty*2;Qty*5    
0002    ,2          ,Qty+4;Qty/5    

ожидаемый

звоните SomeFunction или SQLQuery получить ниже результата

ID      ,InputValue ,Formulas       ,Qty1   ,Qty2
0001    ,1          ,Qty*2;Qty*5    ,2      ,5
0002    ,2          ,Qty+4;Qty/5    ,6      ,0.4

логика

Формула разрезается ;
The InputValue использует первую формулу для вычисления поля qty1
InputValue использует вторую формулу для вычисления поля qty2

Мой тест

В настоящее время мое решение заключается в использовании программирования C #, чтобы решить эту проблему, но производительность имеет большую проблему, когда данные более чем 100000

    using (var cn = Connection)
    {
        cn.Open();

        var datas = cn.Query(@"
            with cte as (
                select '0001' ID,1 InputValue,'Qty*2;Qty*5' Formulas union all
                select '0002' ID,2 InputValue,'Qty+4;Qty/5' Formulas 
            )
            select * into #T from cte;
            select * from #T;
        ");

        var result = datas.Select(s => {
            var arr = (s.Formulas as string).Split(';');
            var qtyFor = arr[0].Replace("Qty",  Convert.ToString(s.InputValue));
            var qty1For = arr[1].Replace("Qty",  Convert.ToString(s.InputValue));
            var qty = new DataTable().Compute(qtyFor, string.Empty);
            var qty1 = new DataTable().Compute(qty1For, string.Empty);
            return new {s.ID,s.InputValue,s.Formulas,Qty=qty,Qty1=qty1};
        });

        Console.WriteLine(result);
        /*
            Result:
            ID      ,InputValue ,Formulas       ,Qty1   ,Qty2
            0001    ,1          ,Qty*2;Qty*5    ,2      ,5
            0002    ,2          ,Qty+4;Qty/5    ,6      ,0.4
        */
    }

Интернет Test Link


Я знаю, что эта структура таблицы странно, но это старая система, без исходного кода

0 ответы