SQL Server聚合函数没有加入视图到表

时间:2017-04-24 13:24:59

标签: sql-server sql-server-2008

我的头衔令人困惑,但我无法用其他方式来描述它。

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

一个例子:

查看

==========================
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,但我无法使其正常工作。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您似乎只需要在视图的所有列中添加一个附加列:

SELECT Item, Value, [Date], 
    (SELECT SUM(Value)
     FROM MyTable
     WHERE MyTable.Item = MyView.Item
        AND MyTable.Date > MyView.Date) AS RecordsSum
FROM MyView