SQL Суммирование данных в последней строке

У меня есть запрос, который генерирует строки подробной информации о чеках, которые были выпущены. В конечном результате все данные объединяются и помещаются в один столбец (короче говоря, их необходимо запустить из Infomaker и экспортировать в текст без разделителей).

В любом случае, в конце этих строк мне нужна итоговая строка, которая содержит два значения, которые являются суммами деталей, использованных в предыдущих строках, наряду с другими значениями, которые жестко заданы. Эта последняя строка также должна быть объединена в один столбец и отображаться после всех строк сведений.

Пример того, как должна выглядеть итоговая строка с вычисленными значениями в скобках:

00123456789999999999940[CHECK AMOUNT SUMMARY][TOTAL NUMBER OF CHECKS (ROWS)]000

Опять же, запрещены пробелы, табуляции или любые другие разделители.

Я поставлен в тупик, как этого добиться. У меня были предложения по использованию UNION, но я не уверен, как именно это сделать для этой ситуации.

Текущий запрос:

declare @checkDate date = '08/30/13'

select 
record = (
-- Checking account number (Record positions 1-9)
cast(cna.BANK_ACCT_NUM as varchar(9)) +    

-- Check number (Record positions 10-19) -- must always be nine characters  
(case 
    when LEN(cr.CHECK_NUM_NUMERIC) = 1 
    then '00000000'
    when LEN(cr.CHECK_NUM_NUMERIC) = 2 
    then '0000000' 
    when LEN(cr.CHECK_NUM_NUMERIC) = 3 
    then '000000'
    when LEN(cr.CHECK_NUM_NUMERIC) = 4 
    then '00000'
    when LEN(cr.CHECK_NUM_NUMERIC) = 5 
    then '0000'
    when LEN(cr.CHECK_NUM_NUMERIC) = 6 
    then '000'
    when LEN(cr.CHECK_NUM_NUMERIC) = 7 
    then '00'
    when LEN(cr.CHECK_NUM_NUMERIC) = 8 
    then '0'
    else ''
    end + cast(cr.CHECK_NUM_NUMERIC as varchar(9))) +

-- Record positions 20-21 - as determined by the bank
'20' +

-- Check amount (Record positions 22-31) -- must always be 10 characters
(case 
    when LEN(cr.CHECK_AMT) = 1 
    then '000000000'
    when LEN(cr.CHECK_AMT) = 2 
    then '00000000' 
    when LEN(cr.CHECK_AMT) = 3 
    then '0000000'
    when LEN(cr.CHECK_AMT) = 4 
    then '000000'
    when LEN(cr.CHECK_AMT) = 5 
    then '00000'
    when LEN(cr.CHECK_AMT) = 6 
    then '0000'
    when LEN(cr.CHECK_AMT) = 7 
    then '000'
    when LEN(cr.CHECK_AMT) = 8 
    then '00'
    when LEN(cr.CHECK_AMT) = 9 
    then '0'
    else ''
    end + cast(REPLACE(cr.CHECK_AMT,'.','') as varchar(10))) +

-- Date issued (MMDDYY)(Record positions 32-37)
cast(REPLACE(convert(char(10),cr.CHECK_DTE,101), '/', '') as varchar(10)) +   

-- Record positions 38-40 - as determined by the bank
'000' +

-- Payee information line 1 (Record positions 41-90)
cr.CHECK_NAME)

from chk_num_alpha_ctl cna,   
chk_reconciliation cr 
where ( cr.check_num_alpha = cna.check_num_alpha ) and  
( ( cr.check_rtn_void_dte is null ) AND  
( cr.check_dte = @checkDate ) ) AND  
( cna.bank_acct_num = 'xxxx-xxxx' )   
order by cr.check_dte ASC   

1 ответ

Решение

- Во-первых, вы можете упростить ваш запрос, используя этот тип оператора 'right-justify-zero-fill' (отрегулируйте, если больше или меньше 9 символов):

select right('000000000' + cast(cr.CHECK_NUM_NUMERIC as varchar(9)),9) 

- Затем попробуйте что-то вроде этого (я не могу проверить это, поэтому могут быть некоторые корректировки):

UNION
select '00123456789999999999940' 
+ right('000000000' + cast(sum(cr.CHECK_AMT) as varchar(9)),9) 
+ right('000000000' + cast(count(cr.CHECK_AMT) as varchar(9)),9) 
+ '000'
from chk_num_alpha_ctl cna,   
chk_reconciliation cr 
where ( cr.check_num_alpha = cna.check_num_alpha ) and  
( ( cr.check_rtn_void_dte is null ) AND  
( cr.check_dte = @checkDate ) ) AND  
( cna.bank_acct_num = 'xxxx-xxxx' )   
GROUP BY cr.check_dte 
order by cr.check_dte ASC  
Другие вопросы по тегам