2015-06-10 1 views
1

У меня есть таблица с 2 колонкой:Как рассчитать агрегированные функции продукта в SQL Server

No. Name Serial 
1 Tom  1 
2 Bob  5 
3 Don  3 
4 Jim  6 

Я хочу добавить столбец, содержание кратны Серийные колонки, как это:

No. Name Serial Multiply 
1 Tom  2   2 
2 Bob  5   10 
3 Don  3   30 
4 Jim  6   180 

Как я могу это сделать?

+0

Как точно вычисляется множимая колонка? – kojow7

+0

Вы не должны хранить вычисляемый столбец в базе данных. Вместо этого создайте вложенный оператор select для вычисления значения для вас. – kojow7

ответ

3

О, это боль. Большинство баз данных не поддерживают функцию агрегации product. Вы можете эмулировать его с помощью журналов и полномочий. Так, что-то подобное может работать:

select t.*, 
     (select exp(sum(log(serial))) 
     from table t2 
     where t2.no <= t.no 
     ) as cumeProduct 
from table t; 

Обратите внимание, что log() можно назвать ln() в некоторых базах данных. Кроме того, это работает для положительных номеров. Существуют вариации для обработки отрицательных чисел и нулей, но это усложняет ответ (и данные выборки все положительные).

+0

@TommySayugo - нет, вы можете ссылаться на * ту же самую таблицу несколько раз в запросе. Когда вы это сделаете, вы должны использовать * aliases * ('t',' t2'), чтобы указать, к какому экземпляру таблицы вы обращаетесь. –

1

Создание агрегата CLR не так уж плохо. Я взбитое это в около 5 минут:

[Serializable] 
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)] 
public struct Product 
{ 
    private SqlDouble _p; 
    public void Init() 
    { 
     this._p = new SqlDouble(1); 
    } 

    public void Accumulate(SqlDouble Value) 
    { 
     this._p *= Value; 
    } 

    public void Merge (Product Group) 
    { 
     this._p *= Group._p; 
    } 

    public SqlDouble Terminate() 
    { 
     // Put your code here 
     return _p; 
    } 
} 

После того, как вы получили, что вы можете использовать методы, обычно используемые для текущей суммы (то есть треугольный присоединиться или определение окна, которое ограничивает строки, в зависимости от ваша версия sql).

Смежные вопросы