Для начала: Я запрашиваю сервер DB2, встроенный в системный пакет IBM i из Excel 2007, с помощью «Из Microsoft Query» и прямого SQL. Это финансовая база данных.Суммирование над вычисленным полем конкатенированных строк (split acct #s)
DB структурирован таким образом, что учетная запись # разделена на 8 целых полей для фонда, деления, отдела, активности 1, активности 2, элемента 1, элемента 2 и объекта. Для того, чтобы сделать запрос результатов читаемым я сцепляюсь их со следующим кодом:
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-символьная строка (для добавления начальных нулей), затем обрезание конечных пустых пространств (от преобразования типов) и, наконец, захват правильных # разрядов для каждого с использованием right(). Это в конечном итоге составляя единый учетный #, который мы используем изо дня в день в следующем формате:
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