2012年4月8日 星期日

Transact-SQL 數字連乘


這是之前在 MSDN 論壇上幫網友解答的一個問題,在這做個筆記。

我們使用 SQL 指令計算總和時,都會用 SUM 搭配 GROUP,也就是選出符合的數字資料並將其連加 (如:10 + 20 + 50)。但是,要針對符合的數字資料進行連乘 (如:10 * 20 * 50) 時,又該怎麼做呢?


先回憶一下數學上的兩個觀念 --

1). LOG   相加是怎麼算的:LOG(10) + LOG(20) + LOG(30) = LOG(10*20*30)
2). 乘方和 LOG 是可以相互抵消的 (底數必須相同)

而這個問題就可以利用 POWER(10 的乘方)、LOG10(LOG 以 10 為基底)、GROUP 來解決,舉例如下:

NOTE 欲複製程式碼的讀者,先將滑鼠指標移至程式碼區,雙擊 (Double-Click) 滑鼠左鍵,此時該區程式碼應會呈現 Highlight 狀態;再按下滑鼠右鍵,於出現的選單中選擇複製。若程式碼未出現 Highlight 狀態,請重整 (Refresh) 本網頁後,再重複上述動作。

-- 建立測試資料
--declare @Test table (c1 varchar(5), c2 int)
declare @Test table (c1 varchar(5), c2 float)

insert into @Test values('AAA', 10)
insert into @Test values('AAA', 20)
insert into @Test values('AAA', 30)
insert into @Test values('BBB', 40)
insert into @Test values('BBB', 50)

-- 得到答案
select c1, power(10.0, sum(log10(C2))) Result
from @Test
group by c1