sql选择运行总计

sql选择运行总计,sql,sql-server,Sql,Sql Server,请帮我回答这个问题 我想按日期1分组,然后按日期升序排序,并用累积结果更新RunningTotal字段 到目前为止,这就是我所拥有的 CREATE TABLE dbo.RunningTotal ( date1 date ,Entry int ,RunningTotal int ) INSERT INTO dbo.RunningTotal (date1,Entry,RunningTotal)VALUES('2015-01-03',100,NULL) INSERT

请帮我回答这个问题

我想按日期1分组,然后按日期升序排序,并用累积结果更新RunningTotal字段

到目前为止,这就是我所拥有的

CREATE TABLE dbo.RunningTotal (
    date1 date    
    ,Entry int
    ,RunningTotal int
)

INSERT INTO dbo.RunningTotal (date1,Entry,RunningTotal)VALUES('2015-01-03',100,NULL)
INSERT INTO dbo.RunningTotal (date1,Entry,RunningTotal)VALUES('2015-02-03',200,NULL)
INSERT INTO dbo.RunningTotal (date1,Entry,RunningTotal)VALUES('2015-05-03',300,NULL)
INSERT INTO dbo.RunningTotal (date1,Entry,RunningTotal)VALUES('2015-07-13',400,NULL)
INSERT INTO dbo.RunningTotal (date1,Entry,RunningTotal)VALUES('2015-01-03',-500,NULL)

UPDATE dbo.RunningTotal
SET RunningTotal = RT2.RunningTotal
FROM dbo.RunningTotal RT1
INNER JOIN (
    SELECT 
        Entry
        ,(SELECT SUM(Entry) FROM dbo.RunningTotal WHERE Entry <= rt.Entry) As RunningTotal
    FROM dbo.RunningTotal rt
) RT2
ON RT1.Entry = RT2.Entry

SELECT * FROM dbo.RunningTotal
但是在这个选择中,我没有考虑日期和分组


谢谢

由于您可能希望在插入新记录后更新运行总数,因此使用触发器进行更新是有意义的。下面是一些简单的SQL语句,可以创建一个触发器来实现这一点

CREATE TRIGGER UpdateRunningTotal   ON  dbo.RunningTotal
AFTER INSERT 
AS 
BEGIN

DECLARE @date DATE, @total INT
--get the date of the insert record
SET @date = (SELECT date1 from inserted)
--get the total for that date
SET @total = (SELECT SUM(Entry) FROM dbo.RunningTotal WHERE dbo.RunningTotal.date1 = @date)
--update all records with new running total
UPDATE dbo.RunningTotal SET dbo.RunningTotal.RunningTotal = @total WHERE  dbo.RunningTotal.date1 = @date

END
GO

您的查询有几个问题。correlation子句需要跟踪日期,表名需要是FROM子句中的别名


您没有指定在日期相同时要执行的操作。

您能否指定要按日期分组的具体选项等。SQL Server的哪个版本?请发布预期的输出。您使用的是哪个SQL Server版本?2012年,窗口功能超前滞后仅用于此目的。在以前的版本中有点不同。@阿米尔:您不需要提前或延迟完成此操作,只需在“截止日期前订购”1之前输入一个简单的SUMMENTRY即可完成此操作,但这需要SQL Server 2012 Hi,谢谢您的帮助。我只是做了@Amir sugested所做的:从运行Total order by date1 asc中选择entry、date1、sumentry OVER order by date1作为总计
UPDATE toupdate
    SET RunningTotal = RT.RunningTotal
FROM dbo.RunningTotal toupdate INNER JOIN
     (SELECT rt.*
             (SELECT SUM(rt2.Entry)
              FROM dbo.RunningTotal rt2
              WHERE rt2.date1 <= toupdate.date1
             ) As RunningTotal
      FROM dbo.RunningTotal rt
     ) RT
     ON toupdate.date1 = rt.date1;