sql server 2008运行2个日期之间的总计

时间:2018-02-22 10:29:42

标签: sql-server-2008

我需要在我的sql server表中运行两个日期之间的总计并同时更新记录。我的数据如下,按日期排序,voucher_no

DATE         VOUCHER_NO    OPEN_BAL   DEBITS   CREDITS    CLOS_BAL 
-------------------------------------------------------------------    
10/10/2017       1            100       10                  110    
12/10/2017       2            110                5          105
13/10/2017       3            105       20                  125

现在如果我在12/10/2017插入带有voucher_no 4的记录,输出应该是

DATE         VOUCHER_NO    OPEN_BAL   DEBITS   CREDITS    CLOS_BAL
------------------------------------------------------------------    
10/10/2017       1            100       10                  110    
12/10/2017       2            110                5          105    
12/10/2017       4            105       4                   109
13/10/2017       3            109       20                  129

我看过几个例子,这些例子可以查找到某个日期的运行总计,但不会发现两个日期之间或从特定日期到文件结尾

1 个答案:

答案 0 :(得分:0)

您应该考虑更改数据库结构。我认为将Private Sub buttonDelete_Click() 'When the Delete button is clicked, the following function is ran to copy the row from Current Services, move it to Cancelled Services 'and then delete the row from Current Services. Dim wkBk1 As Workbook Dim wkBk2 As Workbook Dim xRg As Range Dim xCell As Range Dim I As Long Dim J As Long Dim K As Long Dim count As Long On Error Resume Next Set wkBk1 = Workbooks.Open("C:\Users\Nathan\Desktop\Sandbox\testMacro.xlsm") Set wkBk2 = Workbooks.Open("C:\Users\Nathan\Desktop\Sandbox\testMacro2.xlsm") If Err.Number = 1004 Then MsgBox "File Does Not Exist" End If I = wkBk1.Worksheets("Current Customers").UsedRange.Rows.count J = Worksheets("Cancelled Services").UsedRange.Rows.count count = 0 If J = 1 Then If Application.WorksheetFunction.CountA(Worksheets("Cancelled Services").UsedRange) = 0 Then J = 0 End If Set xRg = Worksheets("Current Customers").Range("A1:A" & I) On Error Resume Next Application.ScreenUpdating = False For K = 1 To xRg.count If CStr(xRg(K).Value) = Me.fName.Value Then count = count + 1 xRg(K).EntireRow.Copy Destination:=Worksheets("Cancelled Services").Range("A" & J + 1) xRg(K).EntireRow.Delete If CStr(xRg(K).Value) = Me.fName.Value Then K = K - 1 End If J = J + 1 End If Next Application.ScreenUpdating = True MsgBox count & " rows moved" End Sub 放在一个表中会更好。并创建视图来计算余额。在这种情况下,您不必在每次插入后更新表。在这种情况下,您的表格看起来像

DATE, VOUCHER_NO, DEBITS, CREDITS

视图将是

create table myTable (
    DATE date 
    , VOUCHER_NO int
    , DEBITS int
    , CREDITS int
)

insert into myTable values
    ('20171010', 1, 10, null),( '20171012', 2, null, 5)
    , ('20171013', 3, 20, null), ('20171012', 4, 4, null)

如果您无法更改数据库结构,那么这是另一种解决方案。在这种情况下,每次插入后都必须运行update语句。在这两种情况下,我都假设重新计算时初始余额为100

;with cte as (
    select
        DATE, VOUCHER_NO, DEBITS, CREDITS, bal = isnull(DEBITS, CREDITS) * case when DEBITS is null then -1 else 1 end
        , rn = row_number() over (order by DATE, VOUCHER_NO)
    from 
        myTable
)

select
    a.DATE, a.VOUCHER_NO, a.DEBITS, a.CREDITS
    , OPEN_BAL = sum(b.bal + case when b.rn = 1 then 100 else 0 end) - a.bal
    , CLOS_BAL = sum(b.bal + case when b.rn = 1 then 100 else 0 end)
from
    cte a
    join cte b on a.rn >= b.rn
group by a.DATE, a.VOUCHER_NO, a.rn, a.bal, a.DEBITS, a.CREDITS