Про агрегатные функции

Павел
Дата: 24.01.2001 10:45:43
Уважаемый ALL! Вот какие грабли: всем известна функция SUM, возвращающая сумму значений в группе. А мне нужно произведение значений. Оказывается такой функции нет!!!. UDF не получтися - 7.0 Как выкрутится, не используя курсор? Постановка проблемы прваильная, т.к. задача математически иначе в принципе не решается.
Кузьмичев Дмитрий
Дата: 24.01.2001 19:56:27
Как известно, логарифм произведения равен сумме логарифмов.
Log(X*Y)=Log(X)+Log(Y)
Умножить(X) -> Exp(Sum(Log(X)))
Единственная проблема заключается в том, что LOG(X) определен только для X > 0.
Это можно обойти, используя конструкцию case.

Также мне очень интересна суть данной задачи, если это не является тайной, расскажите.

С уважением, Кузьмичев.Д.
Павел
Дата: 25.01.2001 05:32:17
Спасибо огромное Дмитрий! (кажется мне снова пора в школу)
Суть задачи совсем не есть тайна. Необходимо насчитывать прибыль, полученную при продаже продукции, опираясь на себестоимость и цену реализации. Кроме того существует несколько факторов, влияющих на себестоимость в процессе от преобретения до реализации, выраженных в процентах: процент банковского кредита и несколько других. Естно во времени эти факторы изменяются (для чего есть отдельные справочники) т.е. получаем 'процент на процент'. Чем больше продукция лежит, тем выше ее себестоимость для оправдания всех связанных с ней затрат. Решаю я эту задачу так: выбираю интересующую группу или отдельную (или всю) продукцию с датами прихода и расхода, себестоимостью и отпускной ценой и перемножаю на таблицы - справочники, отбирая по датам необходимые коэффициенты. Остается только 'взвесить' их по длительности действия и перемножить с себестоимостью.
Garya
Дата: 30.01.2001 22:54:50
А еще можно использовать курсор в хранимой процедуре. В цикле пробежаться по всем хаписям - и все их перемножить. Правда, работает это гшораздо медленнее, нежели использование агрегатных функций.
Павел
Дата: 31.01.2001 05:33:42
Hi, Garya. Вот и в этой конфе встретились... Конечно курсором медленно. Да и вопросе я оговорился что это нежелательно. А предложенный Дмитрием вариант выполняется практически 'влет'. Для сравненя - вариант с курсором (local, fast_forward, т.е. самый 'легкий') отрабатывает в моем случае минуты 2-3