Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如何查找事件发生后所有事务的总和?_Tsql_Ssms 2014 - Fatal编程技术网

Tsql 如何查找事件发生后所有事务的总和?

Tsql 如何查找事件发生后所有事务的总和?,tsql,ssms-2014,Tsql,Ssms 2014,假设我有一群捐赠者,他们不定期地捐款。我可以把捐赠者的名字、捐赠金额和捐赠日期放在一个表格中,但我想做一个报告,显示所有这些信息加上金额后所有捐赠的价值 我知道我可以使用循环解析,但是有更好的方法吗 我在这里作弊,因为我不必费心处理代码,这些代码将通过捐赠者分配一个交易号,并确保一切都是正确的顺序。这很容易 DECLARE @Donors TABLE ( ID INT IDENTITY , Name

假设我有一群捐赠者,他们不定期地捐款。我可以把捐赠者的名字、捐赠金额和捐赠日期放在一个表格中,但我想做一个报告,显示所有这些信息加上金额后所有捐赠的价值

我知道我可以使用循环解析,但是有更好的方法吗

我在这里作弊,因为我不必费心处理代码,这些代码将通过捐赠者分配一个交易号,并确保一切都是正确的顺序。这很容易

    DECLARE @Donors TABLE (
          ID                INT IDENTITY
        , Name              NVARCHAR(30)
        , NID               INT
        , Amount            DECIMAL(7,2)
        , DonationDate      DATE
        , AmountAfter       DECIMAL(7,2)
        )

    INSERT INTO @Donors VALUES
          ('Adam Zephyr',1,100.00,'2017-01-14',NULL)
        , ('Adam Zephyr',2,200.00,'2017-01-17',NULL)
        , ('Adam Zephyr',3,150.00,'2017-01-20',NULL)
        , ('Braden Yu',1,50.00,'2017-01-11',NULL)
        , ('Braden Yu',2,75.00,'2017-01-19',NULL)

    DECLARE   @Counter1     INT = 0
            , @Name         NVARCHAR(30)

    WHILE @Counter1 < (SELECT MAX(ID) FROM @Donors)
        BEGIN
            SET @Counter1 += 1
            SET @Name = (SELECT Name FROM @Donors WHERE ID = @Counter1)
            UPDATE d1
                SET AmountAfter = (SELECT ISNULL(SUM(Amount),0) FROM @Donors d2 WHERE ID > @Counter1 AND Name = @Name)
                    FROM @Donors d1
                        WHERE d1.ID = @Counter1
        END

    SELECT * FROM @Donors
DECLARE@providers表(
ID整型标识
,姓名NVARCHAR(30)
,NID INT
,金额小数(7,2)
,捐赠日期
,小数点后的数量(7,2)
)
插入到@providers值中
('Adam Zephyr',1100.00,'2017-01-14',空)
,('Adam Zephyr',2200.00,'2017-01-17',空)
,('Adam Zephyr',3150.00,'2017-01-20',空)
,('Braden Yu',1,50.00,'2017-01-11',空)
,('Braden Yu',2,75.00,'2017-01-19',空)
声明@Counter1 INT=0
,@Name NVARCHAR(30)
而@Counter1<(从@providers中选择MAX(ID)
开始
设置@Counter1+=1
设置@Name=(从@providers中选择名称,其中ID=@Counter1)
更新d1
设置AmountAfter=(从@d2中选择ISNULL(总和(金额),0),其中ID>@Counter1和Name=@Name)
来自@d1
其中d1.ID=@Counter1
结束
从@providers中选择*

似乎应该有一种递归的方法来实现这一点,但我就是不能对此束手无策。

这将显示每个
姓名的最新捐赠,我认为这是捐赠者以及该人捐赠的所有金额的总和。也许对分区使用
NID
更合适

;with MostRecentDonations as (
    select *,
         row_number() over (partition by Name order by DonationDate desc) as rn,
         sum(Amount) over (partition by Name) as TotalDonations
    from @Donors
)
select * from MostRecentDonations
where rn = 1;
当然,没有必要在任何地方存储运行总数,除非您有某种性能问题

编辑: 我考虑过你的问题,现在我想你只需要一个包含所有交易的总金额。这也很简单:

select *,
    sum(Amount) over (partition by Name order by DonationDate) as DonationsToDate
from @Donors
order by Name, DonationDate;