【问题标题】:sql select running totalsql 选择运行总计
【发布时间】:2015-08-31 09:54:30
【问题描述】:

请帮忙解决这个问题

我想按 date1 分组,然后按日期升序排序,并用累积结果更新 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-Server?
  • 请发布预期的输出。
  • 您使用的是哪个 sql-server 版本?在 2012 年,有专门用于此目的的窗口函数(Lead-Lag)。在以前的版本中,它有点不同。
  • @Amir:你不需要 Lead() 或 lag(),一个简单的sum(entry) (over order by date1) 就可以完成这项工作(但是是的,这需要 SQL Server 2012)

标签: sql sql-server


【解决方案1】:

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

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;

当日期相同时,您不会指定要做什么。

【讨论】:

  • 您好,感谢您的帮助。我只是做了@Amir 建议的事情:从#RunningTotal order by date1 asc 中选择条目,date1,sum(entry) OVER (order by date1) as Total
【解决方案2】:

由于您可能希望在插入新记录后更新运行总计,因此使用触发器执行此操作很有意义。下面是一些用于创建触发器的简单 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

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2023-03-23
    • 2013-01-17
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2011-03-08
    相关资源
    最近更新 更多