Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Calcolo dei rendimenti collegati geometricamente in SQL SERVER 2008

Hai due opzioni per ottenere un prodotto in SQL Server.

1. Simula utilizzando log ed esponenti:

SQL Fiddle

create table returns
(
  returnDate date,
  returnValue float
)

insert into returns values('05/31/06', -0.002271835)
insert into returns values('06/30/06', -0.001095986)
insert into returns values('07/31/06', 0.006984908)
insert into returns values('08/31/06', 0.014865360)
insert into returns values('09/30/06', 0.008938896)

select totalReturn = power
  (
    cast(10.0 as float)
    , sum(log10(returnValue + 1.0))
  ) - 1
from returns;

with tr as
(
  select totalReturn = power
  (
    cast(10.0 as float)
    , sum(log10(returnValue + 1.0))
  ) - 1
  , months = cast(count(1) as float)
  from returns
)
select annualized = power(totalReturn + 1, (1.0 / (months / 12.0))) - 1
from tr;

Questo sfrutta log ed esponenti per simulare il calcolo di un prodotto. Ulteriori informazioni:Funzioni definite dall'utente .

L'unico problema qui è che non riuscirà a restituire <-100%. Se non te li aspetti va bene, altrimenti dovrai impostare tutti i valori da <100% a -100%.

Puoi quindi utilizzare questo rendimento effettivo per ottenere un rendimento annualizzato come richiesto.

2. Definisci un'aggregazione personalizzata con CLR:

Vedi Libri in linea .

È possibile creare una funzione personalizzata CLR e quindi collegarla a un aggregato da utilizzare nelle query. Questo è più lavoro e dovrai abilitare i CLR sul tuo server, ma una volta terminato, potrai usarlo quanto necessario.