Sql server 不受where子句限制的SQL和

Sql server 不受where子句限制的SQL和,sql-server,sql-server-2012,sum,Sql Server,Sql Server 2012,Sum,我是第一次使用总和,并有以下疑问: SELECT Id, Amount, Date, TotalAmount = SUM(Amount) OVER (order by Amount) FROM Account WHERE Date >= '2016-03-01' AND Date <= '2016-03-10' AND UserId = 'xyz' ORDER BY ValutaDate TotalAmount应该是特定用户整个表的运行总计,因此Sum over子句应该尊重用户的w

我是第一次使用总和,并有以下疑问:

SELECT Id, Amount, Date, TotalAmount = SUM(Amount) OVER (order by Amount)
FROM Account
WHERE Date >= '2016-03-01' AND Date <= '2016-03-10' AND UserId = 'xyz'
ORDER BY ValutaDate
TotalAmount应该是特定用户整个表的运行总计,因此Sum over子句应该尊重用户的where子句。另一方面,我只需要一些记录,而不是整个表,这就是我添加where子句指定日期范围的原因。但是现在,当然,我的总和只针对我指定的范围进行计算

我应该怎么做,只得到几个日期范围指定的记录,但得到整个表的总和。有没有一种有效的方法来实现这一点


提前感谢您的帮助。

首先应用WHERE子句,因此总和无法访问与之不匹配的行。 不过你可以使用apply。注意,它将为该用户读取整个表,因此如果没有合适的索引,可能不会执行得太好

SELECT a.Id, a.Amount, a.Date, ta.TotalAmount
FROM Account a
OUTER APPLY (SELECT SUM(CASE WHEN a2.Date <= Account.Date THEN a2.TotalAmount ELSE 0 END) AS TotalAmount FROM Account a2 WHERE a2.UserId = Account.UserId) ta
WHERE a.Date >= '2016-03-01' AND a.Date <= '2016-03-10' AND a.UserId = 'xyz'

首先应用WHERE子句,因此总和不能访问与之不匹配的行。 不过你可以使用apply。注意,它将为该用户读取整个表,因此如果没有合适的索引,可能不会执行得太好

SELECT a.Id, a.Amount, a.Date, ta.TotalAmount
FROM Account a
OUTER APPLY (SELECT SUM(CASE WHEN a2.Date <= Account.Date THEN a2.TotalAmount ELSE 0 END) AS TotalAmount FROM Account a2 WHERE a2.UserId = Account.UserId) ta
WHERE a.Date >= '2016-03-01' AND a.Date <= '2016-03-10' AND a.UserId = 'xyz'

将正在运行的总计分解为自己的查询

; WITH all_rows_one_user as (SELECT *
       , TotalAmount = SUM(Amount) OVER (order by ValutaDate) 
    FROM Account
    WHERE UserId = 'xyz')
SELECT Id, Amount, Date, TotalAmount
FROM all_rows_one_user
WHERE Date >= '2016-03-01' AND Date <= '2016-03-10'
ORDER BY ValutaDate
相同的查询,不同的语法:

SELECT Id, Amount, Date, TotalAmount
FROM (SELECT *
       , TotalAmount = SUM(Amount) OVER (order by ValutaDate) 
    FROM Account
    WHERE UserId = 'xyz') AS all_rows_one_user
WHERE Date >= '2016-03-01' AND Date <= '2016-03-10'
ORDER BY ValutaDate

将正在运行的总计分解为自己的查询

; WITH all_rows_one_user as (SELECT *
       , TotalAmount = SUM(Amount) OVER (order by ValutaDate) 
    FROM Account
    WHERE UserId = 'xyz')
SELECT Id, Amount, Date, TotalAmount
FROM all_rows_one_user
WHERE Date >= '2016-03-01' AND Date <= '2016-03-10'
ORDER BY ValutaDate
相同的查询,不同的语法:

SELECT Id, Amount, Date, TotalAmount
FROM (SELECT *
       , TotalAmount = SUM(Amount) OVER (order by ValutaDate) 
    FROM Account
    WHERE UserId = 'xyz') AS all_rows_one_user
WHERE Date >= '2016-03-01' AND Date <= '2016-03-10'
ORDER BY ValutaDate

这个查询是否给出了运行总数?@FLICKER很好,没有。错过了!有更新的查询,谢谢。但依赖于每个用户ID的日期是唯一的。这个查询是否给出了运行总数?@FLICKER很好,没有。错过了!有更新的查询,谢谢。但是,依赖于每个用户ID的日期是唯一的。谢谢!效果很好。我应该添加哪些索引来说明我没有遇到性能问题?谢谢!效果很好。我应该添加哪些索引以表明我没有在性能问题中运行?