最近在弄一個報表,要求每行的最後一列欄位顯示餘額金額,就是上一行餘額金額加上當前行的餘額 一開始我都是在程式裡面處理,這次需要用Sql寫出來,一下犯難了。 同事介紹到有個視窗函數可以實現,我用了好多年的SqlServer,都不知有這個東西。 記錄一下,免得以後忘記了 以這個表為例子 --不分組統計 ...
最近在弄一個報表,要求每行的最後一列欄位顯示餘額金額,就是上一行餘額金額加上當前行的餘額
一開始我都是在程式裡面處理,這次需要用Sql寫出來,一下犯難了。
同事介紹到有個視窗函數可以實現,我用了好多年的SqlServer,都不知有這個東西。
記錄一下,免得以後忘記了
以這個表為例子
--不分組統計 select *, sum(score) over(order by score desc,id) as '分數餘額', sum(score) over() as '分數總計', rank() over(order by score desc ) '排名', dense_rank() over(order by score desc) as '排名2', row_number() over(order by score desc) as '行號' from Test01 order by score desc --分組統計 select *, sum(score) over(partition by class order by score desc,id) as '所在班級分數餘額', sum(score) over(partition by class) as '所在班級分數總計', rank() over(partition by class order by score desc ) '所在班級排名', dense_rank() over(partition by class order by score desc) as '所在班級排名2', row_number() over(partition by class order by score desc) as '所在班級行號' from Test01 order by class, score desc
如果如下圖所示
視窗函數大體可以分成兩種
一種是聚合統計類型,partition by跟order by都是可選的,像sum、avg、count、max、min
一種是排行類型,必須有order by,partition by可選,像rank、dense_rank、row_number
Partition By 是以哪個欄位進行分組,沒有就是無分組,或者把全部數據當成一組 Order By 如果加上這個參數,就會以哪個欄位進行排序,並統計當前行跟記錄之上的數據進行計算,如果沒有,就是統計全部行