tft每日頭條

 > 職場

 > wps表格調用數據庫

wps表格調用數據庫

職場 更新时间:2024-08-25 07:39:47

在上一節,實現了報表裡合計行的彙總,在本節,我将實現合計行下面的類、款、項和單位的彙總。

報表結構如圖8.0:

wps表格調用數據庫(8.使用WPS工作薄連接調試SQL之三)1

報表結構 圖8.0

下面分析一下類、款、項和單位彙總的特點:

1、排序列:

類、款、項彙總行的排序編碼都是7位。

其中,類的後四位數字補零;款的後兩位補零。

(類款項科目編碼具體解析規則請參考 第5節 内容)

單位彙總行的排序編碼是13位。項科目編碼 單位編碼合并而成。

2、類、款、項 列:

隻有類、款、項彙總行顯示科目的相應編碼,其他都為空。

3、科目名稱列:

顯示相應彙總行的科目名稱或單位名稱。

類、款、項的科目名稱根據數據源表src的支出功能分類列提取 “-” 前面的編碼,外連接提取set中的km1、km2、km3 中的名稱(圖8.1);

單位名稱根據數據源表src的單位列提取 “-” 前面的編碼,外連接提取set中的dwbm中的單位名稱(圖8.1)(不直接截取單位列“-”後面的名稱,是因為源數據可能是單位全稱,而報表中使用單位簡稱);

注意:set 表裡涉及到的編碼,必須是文本格式的,如果不是文本格式,要使用【分列】功能改成文本格式。

wps表格調用數據庫(8.使用WPS工作薄連接調試SQL之三)2

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:

wps表格調用數據庫(8.使用WPS工作薄連接調試SQL之三)3

類彙總行 圖8.2

對以上SQL語句的說明:

  1. 字符串連接使用 &,類科目名稱前面加入了四個空格,以便更好的縮進。
  2. 根據外層查詢需要的類科目編碼和名稱,内層查詢使用 left([支出功能分類],3) as [類],這個函數截取3個字符,并使用别名[類]。
  3. T LEFT JOIN [set$] as L ON T.[類]=L.[km1],加粗的關鍵字就是左連接語句,這個語句把 T 這個表和 L 表根據ON後面的條件連接起來,用等式左邊的 T.[類] 為依據,匹配右邊的 L.[km1]。
  4. 類彙總行合計彙總行不同,類彙總行出現了 “真實字段”,T.[類]和L.km1mc,并使用了聚合函數sum,所以後面要使用GROUP BY T.[類], L.km1mc 将沒有使用聚合函數的兩個字段列舉出來。

下面構造出款彙總行語句:

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:

wps表格調用數據庫(8.使用WPS工作薄連接調試SQL之三)4

款彙總行 圖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

wps表格調用數據庫(8.使用WPS工作薄連接調試SQL之三)5

項彙總行 圖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

wps表格調用數據庫(8.使用WPS工作薄連接調試SQL之三)6

單位彙總行 圖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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关職場资讯推荐

热门職場资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved