如何在SQL中查找不同值的累积月份到日期总和

时间:2015-10-14 02:05:36

标签: ssms

我有以下表格

CustomerID FName  LName   Score  Int_Score  Contact_Date
----------+------+------+-------+----------+------------- 
10          John   Doe      20     NULL      2014-01-28
10          John   Doe      30     NULL      2014-01-28 
10          John   Doe      20     NULL      2014-01-28
10          John   Doe      40       10      2014-02-10
10          John   Doe      20     NULL      2014-02-25
10          John   Doe      20     NULL      2014-03-25
10          John   Doe      40       10      2014-03-10
10          John   Doe      50       25      2014-04-28
10          John   Doe      20     NULL      2015-01-25
10          John   Doe      50       25      2015-01-28

从这张表中我想计算累积年初日期表中的结果分数。以下是结果分数的计算 -
得分=得分=独特的Int_Score

2014年1月
= 20 + 30 = 50(仅考虑一个20分)

2014年2月
= 40 + 10 = 50(此处已加入20分,因为它已于2014年1月计算)

对于2014年3月,因为在2014年1月已经计入了20分,所以在这里增加了20分。同样,2015年2月已经计入了40,10) 2014年4月
= 50 + 25 = 75

2015年1月(所有分数在新年重置,所有分数值开始计算)
= 20 + 50 + 25 = 95
基于以上所述,我想将结果表格作为

CustomerID   Year   Month   Score
-----------+------+-------+-------
10           2014     1      50
10           2014     2      50
10           2014     3       0
10           2014     4      75 
10           2015     1      95 

请注意,表格的大小很大,大约有10亿条记录,并且每天都会更新。

2 个答案:

答案 0 :(得分:0)

一般方法总是使用GROUP BY

SELECT CustomerID, 
       DATEPART(Year,Contact_Date), 
       DATEPART(Month,Contact_Date), 
       SUM(DISTINCT Score)+COALESCE(Int_Score,0)
GROUP BY CustomerId, 
         DATEPART(Year, Contact_Date), 
         DATEPART(Month, Contact_Date)

你无法做任何事情来加速它。如果你必须总结所有十亿行,它将运行几个小时。我建议添加WHERE日期范围,也许customerID IN。当然,Contact_Date和CustomerID必须是索引字段。如果它是单个索引,则它们必须按GROUP BY的顺序:(CustomerId,Contact_Date)

答案 1 :(得分:0)

试一试。希望它按预期工作。但表现明智我不确定。

 SELECT CUSTOMER_ID, CONTRACT_YEAR, CONTRACT_MONTH,
        SUM(SCORE+INT_SCORE)
 FROM 
      (SELECT DISTINCT CUSTOMER_ID, YEAR(CONTRACT_DATE) AS CONTRACT_YEAR, MONTH(CONTRACT_DATE)  AS CONTRACT_MONTH, SCORE, ISNULL(INT_SCORE,0) AS INT_SCORE
       FROM TABLE
      WHERE NOT EXISTS (SELECT 1 FROM TABLE B 
                         WHERE B.CUSTOMER_ID = A.CUSTOMER_ID
                           AND B.SCORE = A.SCORE
                           AND B.INT_SCORE = A.INT_SCORE
                           AND B.CONTRACT_DATE < A.CONTRACT_DATE)) AS TABLEA
  GROUP BY CUSTOMER_ID, CONTRACT_YEAR, CONTRACT_MONTH