如何根据日期选择增加计数器

时间:2019-04-20 10:14:34

标签: tsql

我有一个带有列的表chequeBounce

  

帐户ID,帐户名,Chdate,chno,chamount

现在,我正在创建一个查询,该查询将得出一个月中Accountid的计数。我需要根据用户选择的日期,用上个月的值增加当前Accountid月的计数。

任何人都可以指导吗?

1 个答案:

答案 0 :(得分:0)

很难从问题中确切知道您想要的是什么,但是我自己做了一些假设,并提出了可以满足您需要的存储过程。我选择存储过程的原因是因为您暗示应该有一个用户定义的变量。
因此,首先,创建此存储过程:

CREATE PROCEDURE dbo.Get_Count 
    @month1 int,
    @month2 int
AS
    SELECT [source].AccountName, sum([source].chamount) as [sum of amount], count([source].AccountID) as [no of AccountID in specified months] FROM
        (SELECT 
            AccountID, AccountName, chno, chamount 
        FROM chequeBounce 
        WHERE 
            MONTH(Chdate) = @month1
        UNION ALL
        SELECT 
            AccountID, AccountName, chno, chamount 
        FROM chequeBounce 
        WHERE 
            MONTH(Chdate) = @month2) as [source]
    GROUP BY [source].AccountID, [source].AccountName, [source].chamount
RETURN 0 

此存储过程采用两个参数@month1@month2。然后,它运行两个查询。一个具有与@month1匹配的where语句,另一个具有与@month2完全相同的语句。然后,将它们合并为一个查询,并计算指定月份每个AccountID上有多少个条目。因此,以相同的方式总计金额。您可以通过键入exec Get_Count来运行该过程,然后键入两个月。这样,如果您想要二月和三月:

exec Get_Count 2, 3

上述查询的结果可能类似于:

AccountName                                        sum of amount         no of AccountID in specified months
-------------------------------------------------- --------------------- ---------------
NameOne                                            200.00                2
NameTwo                                            100.00                1
NameThree                                          100.00                1
NameFour                                           200.00                2
NameFive                                           100.00                1

在此示例中,no of AccountID in specified months是指定月份(2、3)中每个accountID上出现次数的计数。

这是我使用的数据:

create table chequeBounce (
    AccountID int,
    AccountName varchar(50),
    Chdate date,
    chno int,
    chamount money,
)

insert into chequeBounce VALUES
    (1, 'NameOne', GETDATE(), 123, 100)
    ,(2, 'NameTwo', GETDATE(), 123, 100)
    ,(3, 'NameThree', GETDATE(), 123, 100)
    ,(4, 'NameFour', GETDATE(), 123, 100)
    ,(5, 'NameFive', GETDATE(), 123, 100)
    ,(1, 'NameOne', DATEADD(mm, -1, GETDATE()), 123, 100)
    ,(2, 'NameTwo', DATEADD(mm, -2, GETDATE()), 123, 100)
    ,(4, 'NameFour', DATEADD(mm, -4, GETDATE()), 123, 100)
    ,(5, 'NameFive', DATEADD(mm, -5, GETDATE()), 123, 100)
    ,(1, 'NameOne', DATEADD(mm, -2, GETDATE()), 123, 100)
    ,(2, 'NameTwo', DATEADD(mm, -3, GETDATE()), 123, 100)
    ,(4, 'NameFour', DATEADD(mm, -5, GETDATE()), 123, 100)
    ,(4, 'NameFour', DATEADD(mm, -3, GETDATE()), 123, 100)
    ,(4, 'NameFour', DATEADD(mm, -1, GETDATE()), 123, 100)
    ,(5, 'NameFive', DATEADD(mm, -1, GETDATE()), 123, 100)
    ,(1, 'NameOne', DATEADD(mm, -5, GETDATE()), 123, 100)
    ,(3, 'NameThree', DATEADD(mm, -1, GETDATE()), 123, 100)
    ,(4, 'NameFour', DATEADD(mm, -1, GETDATE()), 123, 100)
    ,(5, 'NameFive', DATEADD(mm, -3, GETDATE()), 123, 100)

如果我不太清楚,请随时提出任何问题:)