在Sql2005以上的版本提供了With 關鍵字的以實作的遞歸的應用。同時,在sum(字段) over(partition by 字段1)也有着比較多的應用範圍。
在這裡以一個客戶的銷售記錄為基礎的應用,以便計算出累計與合計
資料例表如下:
create table SaleRecord
(
cCusName varchar(1), /*客戶名稱*/
m int, /*月份*/
imoney money /*金額*/
)
資料範例如下:
資料顯示要求:按月,按客戶展現當月金額,累計金額以及總計金額
with Record as (
select m,ccusname,imoney,imoney as lj
from salerecord where m=1
/*資料初始*/
union all
select sr.m,sr.ccusname,sr.imoney,sr.imoney+r.lj from record r
inner join salerecord sr on r.m+1=sr.m and r.ccusname=sr.ccusname
/*其它月份,特别是sr.imoney+r.lj進行累計*/
)
select M,CCUSNAME,
SUM(IMONEY) OVER (PARTITION BY M,CCUSNAME) AS IMONEY,/*當月金額*/
lj,/*累計金額*/
SUM(IMONEY) OVER (PARTITION BY CCUSNAME) AS TOTAL /*總計金額*/
from Record ORDER BY CCUSNAME,M
效果
這種方式較為友善,靈活應用可以形成更為豐富地應用效果。同時,With形成的遞歸中不能進行乘法運算;在遞歸過程中,支援變量與常量的累計;
這種方式在SqlServer 2005以上版本支援。