Sql 当给定月份没有值时,如何使用特定月份的历史值?

Sql 当给定月份没有值时,如何使用特定月份的历史值?,sql,sql-server,Sql,Sql Server,我有两个SQL Server表 PurchaseOrderReceivingLine PORL是一个表,其中包含来自采购订单的每个收据。每个月有数百个条目 PartyRelationshipScore PRS是一个表,其中包含一个用于连接到PORL表的party-supplier参考号,关系和价格的分数为10分。它还有一个日期字段,用于记录分数更新的时间,因此我们有更新的历史记录 我想要实现的是每个月的供应商摘要。所以我会有供应商,TotalValue,LateParts等等。我很乐意为此创建代

我有两个SQL Server表

PurchaseOrderReceivingLine PORL是一个表,其中包含来自采购订单的每个收据。每个月有数百个条目

PartyRelationshipScore PRS是一个表,其中包含一个用于连接到PORL表的party-supplier参考号,关系和价格的分数为10分。它还有一个日期字段,用于记录分数更新的时间,因此我们有更新的历史记录

我想要实现的是每个月的供应商摘要。所以我会有供应商,TotalValue,LateParts等等。我很乐意为此创建代码。我所要做的是,如果给定月份没有值,那么就得到该月份的分数

例如,在8月1日,我的值可能是5。然后直到10月1日它增加到6时才改变。 在分组中,九月将有一个TotalValue&LateParts值,但由于PRS表中没有九月的记录,它将返回一个NULL值。我需要它来获取记录的最后一个值,并在本例中返回8月5日的值。所以它会回来

Aug 2019 - 5
Sep 2019 - 5
Oct 2019 - 6
提前谢谢

波尔表

+-------+----------------+-------+-------+
| PORL# |   Date (UK)    | Value | Party |
+-------+----------------+-------+-------+
|     1 | 1/8/2019       |   100 |     6 |
|     2 | 1/8/2019       |   250 |     6 |
|     3 | 1/9/2019       |  1000 |     6 |
|     4 | 1/10/2019      |  2000 |     6 |
+-------+----------------+-------+-------+
PRS表

+-------------+------------+-------------------+------------+
| DateChanged (UK) | Party | RelationShipScore | PriceScore |
+-------------+------------+-------------------+------------+
| 1/8/2019         |     6 |                 5 |          5 |
| 1/10/2019        |     6 |                 6 |          7 |
+------------------+-------+-------------------+------------+
首选结果

+----------+-------+------+------------+-------------------+------------+
| Supplier | Month | Year | TotalValue | RelationshipScore | PriceScore |
+----------+-------+------+------------+-------------------+------------+
|        6 |     8 | 2019 |        350 |                 5 |          5 |
|        6 |     9 | 2019 |       1000 |                 5 |          5 |
|        6 |    10 | 2019 |       2000 |                 6 |          7 |
+----------+-------+------+------------+-------------------+------------+
第9个月的relationshipscore和pricescore基于它,与第8个月相比没有变化。

我认为这会有所帮助

select Supplier = T.Party
     , Month = DATEPART(MONTH,T.[Date])
     , Year = DATEPART(YEAR,T.[Date])
     , T.TotalValue
     , R.RelationShipScore
     , R.PriceScore
from (  Select P.[Party],P.[Date],[TotalValue] = sum(P.[Value])
        from PurchaseOrderReceivingLine P
        group by P.[Party],P.[Date] ) T
outer apply ( select top 1  RelationShipScore , PriceScore 
              from PartyRelationshipScore
              where Party = T.Party 
              and DateChanged <= T.[Date]
              Order by DateChanged desc ) R

请在问题中以文本表格的形式提供样本数据和所需结果。同时显示当前查询。第一步是在月份级别创建一个日历表。这是一个简单的月和年的列表,您可以通过外部连接来确保查询始终每月返回。@Nick.McDermaid我将从PORL表中获得每个月的记录。PRS表不一定有任何值,在这种情况下,它需要从上个月获取值。此时,如果您可以发布表DDL,包括唯一键和示例SQL语句,以及示例输入值和所需的results@dimaSUN这个很好用,谢谢。像尼克一样,我今天学到了一些新东西。