Генерация отчета главной книги в SQL Server - PullRequest
0 голосов
/ 06 марта 2012

У меня есть пример таблицы транзакций для аккаунта:

VchNo   TranDate    Credits     Debits
PR1    07 Dec 2011  10000.50      0.00
PI1    13 Dec 2011  26000.00      0.00
PI2    14 Dec 2011  15841.50      0.00
PR2    15 Dec 2011  9845.25       0.00
PL1    31 Dec 2011     0.00   58741.25
PJ3    02 Jan 2012     0.00    1021.00

и я знаю начальные сальдо этого счета

Opening Balance: 99825.00

Я хочу создать отчет основной бухгалтерской книги, например, с указанием начального и конечного сальдо для каждой из упомянутых выше транзакций, например:

VchNo  TranDate     Opening       Credits    Debits   Closing
PR1   07 Dec 2011   99825.00    10000.50      0.00  109825.50
PI1   13 Dec 2011   109825.50   26000.00      0.00  135825.50
PI2   14 Dec 2011   135825.50   15841.50      0.00  151667.00
PR2   15 Dec 2011   151667.00   9845.25       0.00  161512.25
PL1   31 Dec 2011   161512.25      0.00   58741.25  102771.00
PJ3   02 Jan 2012   102771.00      0.00    1021.00  101750.00

В приведенной выше таблице закрытие = открытие + кредиты - дебеты
Закрытие сегодняшнего дня - это открытие следующего дня (последующего дня). Конечное сальдо получено в 101750.00 (см. Последний столбец для VchNo PJ3).

Я приложил образец формата отчета для быстрого ознакомления Ledger Report.
Можно ли добиться этого с помощью ОДНОГО SQL-запроса?

1 Ответ

2 голосов
/ 06 марта 2012

Это должно работать:

CREATE TABLE #Data
(vchno NVARCHAR(6)
,trandate DATETIME
,credits DECIMAL(18,3)
,debits DECIMAL(18,3)
,opening DECIMAL(18,3)
)
INSERT INTO #Data
SELECT 'PR1'as vchno,'07 Dec 2011'as trandate,10000.50 as credits,0.00 as debits,99825 AS opening
UNION ALL SELECT 'PI1' ,'13 Dec 2011' ,  26000.00 ,  0.00,99825  
UNION ALL SELECT 'PI2','14 Dec 2011',  15841.50,  0.00 ,99825
UNION ALL SELECT 'PR2','15 Dec 2011',  9845.25 ,  0.00 ,99825
UNION ALL SELECT 'PL1','31 Dec 2011', 0.00 ,  58741.25 ,99825
UNION ALL SELECT 'PJ3','02 Jan 2012', 0.00,1021.00 ,99825

;With ledger AS
(
SELECT vchno
,trandate
,opening
,credits
,debits
,opening + credits - debits AS closing
,row_number() OVER (ORDER BY trandate) AS row
FROM #data
)
SELECT
l1.vchno
,l1.trandate
,MAX(l1.opening) + ISNULL(SUM(l2.credits),0) - ISNULL(SUM(l2.debits),0) as opening
,MAX(l1.credits) AS issues
,MAX(l1.debits) AS Receips
,MAX(l1.opening) + ISNULL(SUM(l2.credits),0) - ISNULL(SUM(l2.debits),0) + MAX(l1.credits) - MAX(l1.debits) as closing
FROM ledger l1 
LEFT OUTER JOIN ledger l2 on l2.row < l1.row
GROUP BY
l1.vchno
,l1.trandate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...