開始:我使用「From Microsoft Query」和直接SQL查詢從Excel 2007內置到IBM i System包中的DB2服務器。這是一個金融數據庫。總結連接字符串的計算字段(分割acct #s)
該數據庫的結構使帳戶#分成基金,部門,部門,活動1,活動2,元素1,元素2和對象8個整數字段。爲了使查詢結果可讀性我已經級聯他們用下面的代碼:
select
right(trim(trailing from (concat('00',cast(T1."GMFUND" as Char(8))))),3)||'-'
||right(trim(trailing from (concat('00',cast(t1."GMDPT" as Char(8))))),2)
||right(trim(trailing from (concat('00',cast(T1."GMDIV" as Char(8))))),2) ||'-'
||right(trim(trailing from (concat('00',cast(T1."GMSTAB" as Char(8))))),2)
||right(trim(trailing from (concat('00',cast(T1."GMSTAS" as Char(8))))),1)||'.'
||right(trim(trailing from (concat('00',cast(T1."GMELM1" as Char(8))))),1)
||right(trim(trailing from (concat('00',cast(T1."GMELM2" as Char(8))))),1)||'-'
||right(trim(trailing from (concat('00',cast(T1."GMOBJ" as Char(8))))),2)
as AJAccount
這是一個有點難以閱讀,所以我會解釋一下:對於每一個領域,我串聯「00」,以強制轉換爲每個#一個8字符的字符串(用於添加前導零),然後修剪尾部空格(來自類型轉換),最後爲每個使用權利()獲取正確的位數。這最終彌補我們用一天到一天在以下格式的ACCT#:
000-0000-000.00-00
現在,這裏是更復雜的部分。我需要計算借方和貸方的計算字段,其定義如下:
IFNULL(T1."GMDAMT",0)-IFNULL(T1."GMCAMT",0) as Trans_Total
但是這還沒有總結。這就是我遇到我的問題的地方。當我查詢這兩個字段時,我會得到數據庫中每個事務的準確結果,標記爲w/acct #s。但是,當我嘗試將[debits - credits]字段放在SUM()聚合函數中並通過'AJAccount'組進行分組時,我的查詢會引發錯誤。
錯誤指向我的級聯ACCT#字段的以下部分:
right(trim (trailing from (concat('00',cast(T1."GMOBJ" as Char(8))))),2)
具體來說它突出「GMOBJ」爲錯誤的來源。但是,如果沒有SUM()函數,代碼運行良好,生產的結果如下所示:
001-0000-243.00-00 | 166898.00
001-0000-244.00-00 | -166898.00
161-0000-243.00-00 | 3000.00
161-0000-244.00-00 | -3000.00
470-0000-243.00-00 | 4999.00
470-0000-244.00-00 | -4999.00
490-0000-243.00-00 | 1000.00
490-0000-244.00-00 | -1000.00
,這不算什麼,我真正需要做的(因爲交易數據被分割一半按交易類型分成4個不同的表格,我最終需要加入......但這是另一項任務)。但是,直到我得到這個工作,我在一個停止。
這是整個代碼塊:
select
right(trim(trailing from (concat('00',cast(T1."GMFUND" as Char(8))))),3)||'-'
||right(trim(trailing from (concat('00',cast(t1."GMDPT" as Char(8))))),2)
||right(trim(trailing from (concat('00',cast(T1."GMDIV" as Char(8))))),2) ||'-'
||right(trim(trailing from (concat('00',cast(T1."GMSTAB" as Char(8))))),2)
||right(trim(trailing from (concat('00',cast(T1."GMSTAS" as Char(8))))),1)||'.'
||right(trim(trailing from (concat('00',cast(T1."GMELM1" as Char(8))))),1)
||right(trim(trailing from (concat('00',cast(T1."GMELM2" as Char(8))))),1)||'-'
||right(trim(trailing from (concat('00',cast(T1."GMOBJ" as Char(8))))),2)
as AJAccount,
SUM(IFNULL(T1."GMDAMT",0)-IFNULL(T1."GMCAMT",0)) as Trans_Total
from "HTEDTA"."GM310AP" T1
where T1."GMAPYR" = 2014
group by 'AJAccount'
我想也許我typo'd什麼的,所以我做了以下比較容易查詢:
select
T1."GMFUND",
SUM(IFNULL(T1."GMDAMT",0)-IFNULL(T1."GMCAMT",0)) as Trans_Total
from "HTEDTA"."GM310AP" T1
where T1."GMAPYR" = 2014 and T1."GMAPMO" between 1 and 4
group by T1."GMFUND"
order by T1."GMFUND"
,它跑了就好了,產生以下結果:
1 | 20090901.49
111 | 32635.15
114 | 0.00
115 | 0.00
131 | 5916.66
所以我懷疑我缺乏有關計算字段和SUM ()。有人能夠啓發我嗎?
出於好奇,你爲什麼決定'CHAR'格式而不是'INT(8)'? – Sev09
因爲RIGHT()函數需要一個字符串輸入,而INT類型無論如何都不會保留前導零。一位同事寫道,爲了自己的使用並允許我使用它,我認爲他使用了最有效的方法。 – Glamador
感謝您的回答。你是對的前導零。 – Sev09