Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Calcul des retours géométriquement liés dans SQL SERVER 2008

Vous avez deux options pour obtenir un produit dans SQL Server.

1. Simulez à l'aide de logs et d'exposants :

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;

Cela exploite les logs et les exposants pour simuler un calcul de produit. Plus d'informations :Fonctions définies par l'utilisateur .

Le seul problème ici est qu'il échouera pour un retour <-100 %. Si vous ne vous y attendez pas, tout va bien, sinon vous devrez définir des valeurs < 100 % à -100 %.

Vous pouvez ensuite utiliser ce rendement réel pour obtenir un rendement annualisé au besoin.

2. Définissez un agrégat personnalisé avec CLR :

Voir Livres en ligne .

Vous pouvez créer une fonction personnalisée CLR, puis la lier à un agrégat à utiliser dans vos requêtes. C'est plus de travail et vous devrez activer les CLR sur votre serveur, mais une fois que c'est fait, vous pouvez l'utiliser autant que nécessaire.