2013-05-28 10 views
2

У меня есть следующая таблица, но я не знаю, как вычислить столбцы баланса и состояния, как показано ниже, на основе дебетовых и кредитных столбцов?Как рассчитать баланс в sql?

| ID | AR_DATE |ACC_CODE | ACC_NAME | DETAILS | DEBIT | CREDIT | BALANCE ?| STATUS?| 
---------------------------------------------------------------------------------------- 
| 1 | 2013-04-10 |  101 |  A/R | Kofi | 500 |  0 |  500 | Debit | 
| 2 | 2013-04-10 |  101 |  A/R |  AMA |  0 | 250 |  250 | Debit | 
| 3 | 2013-04-11 |  101 |  A/R | Boss |  0 |  50 |  200 | Debit | 
| 4 | 2013-04-12 |  101 |  A/R | Jhon |  0 | 300 |  100 | Credit | 
+4

Если последний баланс будет -100? – Bas

+0

Это, мягко говоря, не хороший дизайн стола для работы. Например, вы никогда не знаете, действительно ли «Баланс» действительно «положительный» или «отрицательный». Вы всегда должны смотреть на «Статус». Если вместо полей 'Debit/Credit' у вас будет только одно поле« Changes »с« 500, -250, -50, -300 », вы можете легко вычислить все, что вам нужно. Теперь я знаю, что у финансового программного обеспечения есть некоторые нелепые требования, но не по крайней мере важно хранить данные, когда вы можете * отображать * данные, подобные приведенной таблице. – Corak

+0

@Corak - это текущий общий расчет, основанный на балансе предыдущей записи. Статус может быть проигнорирован в этом контексте, поскольку (Дебет - Кредит) получит фактическое значение транзакции. Это может быть связано с требованиями к производительности, которые вы хотите сохранить в балансе, по крайней мере, в качестве хранимого вычисленного значения. – Bas

ответ

1

Предполагая, что SQL Server 2012:

SELECT ID, 
     AR_DATE, 
     ACC_CODE, 
     ACC_NAME, 
     DETAILS, 
     DEBIT, 
     CREDIT, 
     SUM(DEBIT - CREDIT) OVER(ORDER BY AR_DATE ASC) AS BALANCE, 
     CASE WHEN CREDIT > 0 THEN 'Credit' ELSE 'Debit' END AS STATUS, 
FROM [WhateverTable] 

Когда у вас нет 2012 вам нужно построить его немного сложнее: (source)

SELECT ID, 
     AR_DATE, 
     ACC_CODE, 
     ACC_NAME, 
     DETAILS, 
     DEBIT, 
     CREDIT, 
     (SELECT SUM(b.DEBIT - b.CREDIT) 
     FROM [WhateverTable] b 
     WHERE b.AR_DATE <= a.AR_DATE) AS BALANCE, 
     CASE WHEN CREDIT > 0 THEN 'Credit' ELSE 'Debit' END AS STATUS, 
FROM [WhateverTable] a 
+0

Просто спрашивайте, что такое уникальное в 2012 году? – gunr2171

+1

Предложение OVER, связанное с SUM – Bas

-1
select case when Debit>0 then balance=balance+debit else 
balance=balance-credit end as balance,case when Balance > Credit then 
'Debit' else 'Credit' end as Status from tableName 

Попробуйте выше запрос.

+0

'case when Debit> Credit then 'Debit' else 'Credit' end as Status' не приведет к тому, что вывод' Status' будет 'Debit, Credit, Credit, Credit' вместо показанного дебетового, дебетового, дебетового , Кредит'? – Corak

+0

@Corak Да, вы правы, это будет, только что наблюдал эту проблему. Но не в состоянии понять логику этого. – Freelancer

+0

Насколько я понимаю: во-первых, есть 'Debit = 500', что приводит к' Balance = 500'. Затем появляется «Credit = 250», в результате чего «Баланс = (500-250) = 250», а затем «Кредит = 50' =>« Баланс = (250 - 50) = 200 », затем« Кредит = 300' => 'Balance = (200 - 300) = -100'. Вот почему @Bas Brekelmans спросил. – Corak

Смежные вопросы