2013-05-28 127 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

这是说,温和地说,不是一个好的餐桌设计。例如,你永远不知道“Balance”本身是否真的是“正面”或“负面”。你总是要看“状态”。如果不是'Debit/Credit'字段,你只需要一个带有'500,-250,-50,-300'的'Changes'字段,就可以轻松计算出你需要的任何东西。现在,我知道财务软件有一些荒谬的要求,但是当你可以显示你所显示的表格这样的数据时,它至少不是数据存储的关键。 – 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

与SUM相关的OVER子句 – 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

当借方>贷记,然后'借方'其他'贷方'结束为状态'不会导致输出状态为'借方,贷方,贷方,贷方'而不是显示的借方,借方,借方,信用? – Corak

+0

@Corak是的,你是对的,它会,现在才观察到这个问题。但不能理解它背后的逻辑。 – Freelancer

+0

据我了解:首先是“借记= 500”,导致“余额= 500”。接下来是“Credit = 250”,产生“Balance =(500-250)= 250”,然后“Credit = 50”=>“Balance =(250-50)= 200”,则“Credit = 300”=> '平衡=(200-300)= -100'。这就是为什么@Bas Brekelmans问道。 – Corak