在上一節,實現了報表裡合計行的彙總,在本節,我将實現合計行下面的類、款、項和單位的彙總。
報表結構如圖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.[項目類别]<>'對個人和家庭補助支出' and
T.[項目類别]<>'公用經費' and T.[項目類别]<>'部門預算項目' and
T.[項目類别]<>'專項資金項目', 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 T
LEFT 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.[項目類别]<>'對個人和家庭補助支出' and
T.[項目類别]<>'公用經費' and T.[項目類别]<>'部門預算項目' and
T.[項目類别]<>'專項資金項目', 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 T
LEFT 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.km1mc
LEFT 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.[項目類别]<>'對個人和家庭補助支出' and
T.[項目類别]<>'公用經費' and T.[項目類别]<>'部門預算項目' and
T.[項目類别]<>'專項資金項目', 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 T
LEFT 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.[項目類别]<>'對個人和家庭補助支出' and
T.[項目類别]<>'公用經費' and T.[項目類别]<>'部門預算項目' and
T.[項目類别]<>'專項資金項目', 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 T
LEFT 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]
到此為止,把報表效果圖中所有的彙總行都單獨寫出來了。
下一節,我會把這些單獨的彙總行合并到一起。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!