對產品進行匯總

更新頁 :
頁面創建日期 :

樣本數據

只需定義一個僅具有年和利息的表,即可定義數據。

-- テーブル定義
declare @利息マスタ table 
(
  年月 nvarchar(6)
 ,利息 decimal(4, 2)
)

-- サンプルデータ挿入
insert @利息マスタ
          select N'201501', 1.05
union all select N'201502', 1.03
union all select N'201503', 1.02
union all select N'201504', 1.10
union all select N'201505', 1.02
union all select N'201506', 1.06
union all select N'201507', 1.07
union all select N'201508', 1.04
union all select N'201509', 1.06
union all select N'201510', 1.07
union all select N'201511', 1.03
union all select N'201512', 1.02

-- 確認
select * from @利息マスタ

累計乘積

乘積的聚合可以由「指數函數」和「對數函數」的聚合確定。 SQL 應如下所示:

-- 集計
select exp(sum(log([利息]))) from @利息マスタ
-- 結果:1.73968081491318

這可以通過「指數函數」和「對數函數」的性質來實現。

首先,對數函數的摘要根據公式為“日誌 x + 日誌 y = 日誌 (x = y)”。 指數函數的公式「elogx = x**」表示」elog(x*y) = x = y“,如果應用對數函數的總和。 (x * y * ... 部分成為資料的數量)

零和負對應

由於對數函數不能小於或等於 0,因此,如果聚合包含小於或等於 0 的數位,則會發生錯誤。 要匹配小於或等於 0 的數位,SQL 如下所示:

-- 集計(ゼロ、負対応)
select
  case
    when min(abs([利息])) = 0 then 0
    else
       exp(sum(log(abs(nullif([利息], 0)))))
     * round(0.5 - count(nullif(sign(sign([利息]) + 0.5), 1)) % 2, 0)
  end as [利息合計]
from @利息マスタ
-- 結果:1.73968081491318