在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以上版本支持。