發布時間:2024-01-24閱讀(16)
在上一節,實現了報表里合計行的匯總,在本節,我將實現合計行下面的類、款、項和單位的匯總。
報表結構如圖8.0:

報表結構 圖8.0
下面分析一下類、款、項和單位匯總的特點:
1、排序列:
類、款、項匯總行的排序編碼都是7位。
其中,類的后四位數字補零;款的后兩位補零。
(類款項科目編碼具體解析規則請參考 第5節 內容)
單位匯總行的排序編碼是13位。項科目編碼 單位編碼合并而成。
2、類、款、項 列:
只有類、款、項匯總行顯示科目的相應編碼,其他都為空。
3、科目名稱列:
顯示相應匯總行的科目名稱或單位名稱。
類、款、項的科目名稱根據數據源表src的支出功能分類列提取 “-” 前面的編碼,外連接提取set中的km1、km2、km3 中的名稱(圖8.1);
單位名稱根據數據源表src的單位列提取 “-” 前面的編碼,外連接提取set中的dwbm中的單位名稱(圖8.1)(不直接截取單位列“-”后面的名稱,是因為源數據可能是單位全稱,而報表中使用單位簡稱);
注意:set 表里涉及到的編碼,必須是文本格式的,如果不是文本格式,要使用【分列】功能改成文本格式。

set表部分 圖8.1
4、報表中科目名稱后面的列與合計行后面的列相同:[指標總金額]、[指標已用金額]、[指標可用金額]、[計劃金額合計]、[工資福利支出]、[對個人和家庭補助支出]、[公用經費]、[部門預算項目]、[專項資金項目]、[其他項目]。
下面,根據 第7節 合計匯總行的語句,構造出類匯總行的語句:
SELECT T.[類] & 0000 as [排序], T.[類], as [款], as [項], & L.km1mc as [科目名稱] , sum(T.[指標金額]) as [指標總金額], sum(T.[已用指標]) as [指標已用金額],[指標總金額]-[指標已用金額] as [指標可用金額], [指標已用金額] as [計劃金額(含在途)],sum( iif( T.[項目類別]=工資福利支出, T.[已用指標],0)) as [工資福利支出],sum( iif( T.[項目類別]=對個人和家庭補助支出, T.[已用指標],0)) as [對個人和家庭補助支出],sum( iif( T.[項目類別]=公用經費, T.[已用指標],0)) as [公用經費],sum( iif( T.[項目類別]=部門預算項目, T.[已用指標],0)) as [部門預算項目],sum( iif( T.[項目類別]=專項資金項目, T.[已用指標],0)) as [專項資金項目],sum( iif( T.[項目類別]<>工資福利支出 and T.[項目類別]<>對個人和家庭補助支出 andT.[項目類別]<>公用經費 and T.[項目類別]<>部門預算項目 andT.[項目類別]<>專項資金項目, T.[已用指標],0)) as [其他項目]FROM (select left([支出功能分類],3) as [類], max([指標總金額]) as [指標金額], max([指標已用金額]) as [已用指標],[項目類別] from [src$] where (left([單位],6)="101013") and ([計劃月份] between "01" and "05")group by [單位], [項目], [項目類別], [支出功能分類], [政府經濟分類], [部門經濟分類], [是否政府采購]) as TLEFT JOIN [set$] as L ON T.[類]=L.[km1]GROUP BY T.[類], L.km1mc
結果如圖8.2:

類匯總行 圖8.2
對以上SQL語句的說明:
下面構造出款匯總行語句:
SELECT T.[款] & 00 as [排序], as [類], T.[款], as [項], &L.km2mc as [科目名稱] , sum(T.[指標金額]) as [指標總金額], sum(T.[已用指標]) as [指標已用金額],[指標總金額]-[指標已用金額] as [指標可用金額], [指標已用金額] as [計劃金額(含在途)],sum( iif( T.[項目類別]=工資福利支出, T.[已用指標],0)) as [工資福利支出],sum( iif( T.[項目類別]=對個人和家庭補助支出, T.[已用指標],0)) as [對個人和家庭補助支出],sum( iif( T.[項目類別]=公用經費, T.[已用指標],0)) as [公用經費],sum( iif( T.[項目類別]=部門預算項目, T.[已用指標],0)) as [部門預算項目],sum( iif( T.[項目類別]=專項資金項目, T.[已用指標],0)) as [專項資金項目],sum( iif( T.[項目類別]<>工資福利支出 and T.[項目類別]<>對個人和家庭補助支出 andT.[項目類別]<>公用經費 and T.[項目類別]<>部門預算項目 andT.[項目類別]<>專項資金項目, T.[已用指標],0)) as [其他項目]FROM (select left([支出功能分類],5) as [款], max([指標總金額]) as [指標金額], max([指標已用金額]) as [已用指標],[項目類別] from [src$] where (left([單位],6)="101013") and ([計劃月份] between "01" and "05")group by [單位], [項目], [項目類別], [支出功能分類], [政府經濟分類], [部門經濟分類], [是否政府采購]) as TLEFT JOIN [set$] as L ON T.[款]=L.[km2]WHERE L.km2mc <> GROUP BY T.[款], L.km2mc
結果如圖8.3:

款匯總行 圖8.3
款匯總行與類匯總行SQL語句不同的地方:
//第一行差異,排序提取字段不同,類三位加四個0,款是5位加兩個0//真實字段不同分別為T.[類]、L.km1mc;T.[款]、L.km2mc。//科目名稱的縮進不同SELECT T.[類] & 0000 as [排序], T.[類], as [款], as [項], & L.km1mc as [科目名稱] SELECT T.[款] & 00 as [排序], as [類], T.[款], as [項], & L.km2mc as [科目名稱]
//子查詢提取[支出功能分類]的長度不一致select left([支出功能分類],3) as [類]select left([支出功能分類],5) as [款]
//款匯總行多了 WHERE L.km2mc <> 這個過濾條件,這個有什么用呢?//假如 [支出功能分類] 這個字段里面有特殊的科目,這個科目只有一級,沒有二三級科目//一般的科目都是這樣:2010801-行政運行,前面編碼是滿7位的//而特殊科目編碼可能不滿7位:227-預備費、23201-中央政府國內債務付息支出//系統存在這種只到類、款科目的功能分類編碼,這樣就要把取值為空的記錄去掉LEFT JOIN [set$] as L ON T.[類]=L.[km1] GROUP BY T.[類], L.km1mcLEFT JOIN [set$] as L ON T.[款]=L.[km2] WHERE L.km2mc <> GROUP BY T.[款], L.km2mc
下面繼續構造項匯總行SQL語句:
SELECT T.[項] as [排序], as [類], as [款], T.[項], & L.km3mc as [科目名稱] , sum(T.[指標金額]) as [指標總金額], sum(T.[已用指標]) as [指標已用金額],[指標總金額]-[指標已用金額] as [指標可用金額], [指標已用金額] as [計劃金額(含在途)],sum( iif( T.[項目類別]=工資福利支出, T.[已用指標],0)) as [工資福利支出],sum( iif( T.[項目類別]=對個人和家庭補助支出, T.[已用指標],0)) as [對個人和家庭補助支出],sum( iif( T.[項目類別]=公用經費, T.[已用指標],0)) as [公用經費],sum( iif( T.[項目類別]=部門預算項目, T.[已用指標],0)) as [部門預算項目],sum( iif( T.[項目類別]=專項資金項目, T.[已用指標],0)) as [專項資金項目],sum( iif( T.[項目類別]<>工資福利支出 and T.[項目類別]<>對個人和家庭補助支出 andT.[項目類別]<>公用經費 and T.[項目類別]<>部門預算項目 andT.[項目類別]<>專項資金項目, T.[已用指標],0)) as [其他項目]FROM (select left([支出功能分類],7) as [項], max([指標總金額]) as [指標金額], max([指標已用金額]) as [已用指標],[項目類別] from [src$] where (left([單位],6)="101013") and ([計劃月份] between "01" and "05")group by [單位], [項目], [項目類別], [支出功能分類], [政府經濟分類], [部門經濟分類], [是否政府采購]) as TLEFT JOIN [set$] as L ON T.[項]=L.[km3]WHERE L.km3mc <> GROUP BY T.[項], L.km3mc
查詢結果如圖8.4

項匯總行 圖8.4
需要注意的是,為何項的科目名稱不從src的支出功能分類列 “-” 后面提取?原因還是上面說到的,[支出功能分類] 這個字段里面有特殊的科目,科目編碼不一定都是7位的,所以使用
//子查詢提取[支出功能分類]的長度不一致left([支出功能分類],7) as [項]left([支出功能分類],5) as [款]
這兩個函數截取的編碼不一定對,在類似于
T LEFT JOIN [set$] as L ON T.[項]=L.[km3]T LEFT JOIN [set$] as L ON T.[款]=L.[km2]
這樣的左連接匹配時,會找不到L.[km2]或者L.[km3]這個編碼,出現L.km2mc或者L.km3mc為空的記錄,這些記錄在本級匯總時是無用的。
下面構造單位匯總行SQL語句:
SELECT T.[km] & T.[dwbm] as [排序], as [類], as [款], as [項], & L.[dwmc] as [科目名稱] , sum(T.[指標金額]) as [指標總金額], sum(T.[已用指標]) as [指標已用金額],[指標總金額]-[指標已用金額] as [指標可用金額], [指標已用金額] as [計劃金額(含在途)],sum( iif( T.[項目類別]=工資福利支出, T.[已用指標],0)) as [工資福利支出],sum( iif( T.[項目類別]=對個人和家庭補助支出, T.[已用指標],0)) as [對個人和家庭補助支出],sum( iif( T.[項目類別]=公用經費, T.[已用指標],0)) as [公用經費],sum( iif( T.[項目類別]=部門預算項目, T.[已用指標],0)) as [部門預算項目],sum( iif( T.[項目類別]=專項資金項目, T.[已用指標],0)) as [專項資金項目],sum( iif( T.[項目類別]<>工資福利支出 and T.[項目類別]<>對個人和家庭補助支出 andT.[項目類別]<>公用經費 and T.[項目類別]<>部門預算項目 andT.[項目類別]<>專項資金項目, T.[已用指標],0)) as [其他項目]FROM ( select left( [支出功能分類], instr([支出功能分類], -) -1 ) as [km], left([單位],6) as [dwbm], max([指標總金額]) as [指標金額], max([指標已用金額]) as [已用指標],[項目類別] from [src$] where (left([單位],6)="101013") and ([計劃月份] between "01" and "05")group by [單位], [項目], [項目類別], [支出功能分類], [政府經濟分類], [部門經濟分類], [是否政府采購]) as TLEFT JOIN [set$] as L ON T.[dwbm]=L.[dwbm]GROUP BY T.[km], T.[dwbm], L.[dwmc]
查詢結果如圖8.5

單位匯總行 圖8.5
//將 提取的科目編碼和單位編碼合并為[排序]字段SELECT T.[km] & T.[dwbm] as [排序]
//第3行代碼 別名[km]中函數的意思是從左邊截取到“-”這個字符為止select left([支出功能分類],7) as [項]select left( [支出功能分類], instr([支出功能分類], -) -1 ) as [km], left([單位],6) as [dwbm]
到此為止,把報表效果圖中所有的匯總行都單獨寫出來了。
下一節,我會把這些單獨的匯總行合并到一起。
歡迎分享轉載→http://www.avcorse.com/read-215570.html
下一篇:紅娘是哪一部作品中的人物
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖