无需将视图连接到表的 SQL Server 聚合函数

问题描述 投票:0回答:2

我的标题很混乱,但我没有其他方式来描述它。

我有一个视图,根据某些标准为我提供一行。使用此视图,我想过滤另一个表,该表的记录日期必须等于或大于视图中的值。之后,我需要对该表的所有记录求和并减去视图中的一列。

一个例子:

查看

==========================
Item | Value | LastDate
==========================
 A      10     2017-02-01
 B      5      2017-02-03
 C      0      NULL
--------------------------

记录表:

==========================
Item | Value | Date
==========================
 A      20     2017-01-01
 A      -5     2017-02-04 
 A       5     2017-02-03 
 A      10     2017-02-04 
 B       5     2017-01-01 
 B       5     2017-02-21 
 B       5     2017-02-22 
 B      10     2017-02-23 
--------------------------

想要的结果

=======================================
Item | Value | LastDate    | RecordsSum
=======================================
 A      10     2017-02-01     10
 B      5      2017-02-03     20
 C      0      NULL           NULL
---------------------------------------

我尝试使用Fabiano's方法,但是当我只想要总和时,我将记录表数据连接起来。

我可以使用另一个视图来计算值并将其连接到第一个视图,但是这种方法会对数据库进行两次查询,从而使其效率低下,因为它将针对 >1000k 记录运行。

我知道我可能需要使用 CTE,但我无法让它发挥作用。

预先感谢您的帮助。

sql-server sql-server-2008
2个回答
2
投票

像这样怎么样?

select v.Item
    , v.Value
    , v.LastDate
    , SUM(r.Value) as RecordsSum
from View v
join Record r on r.Item = v.Item
                and r.Date > v.LastDate
group by v.Item
    , v.Value
    , v.LastDate

0
投票

看来您只需要在视图的所有列上附加一列:

SELECT Item, Value, [Date], 
    (SELECT SUM(Value)
     FROM MyTable
     WHERE MyTable.Item = MyView.Item
        AND MyTable.Date > MyView.Date) AS RecordsSum
FROM MyView
© www.soinside.com 2019 - 2024. All rights reserved.