2015-10-14 139 views
0

我有以下表如何找到累計月至不同值的日期和在SQL

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

對於Jan2014
= 20 + 30 = 50(只有20的一個分被認爲)

對於Feb2014
= 40+計算10 = 50(2014年1月加入20分,因爲它已經在2014年1月入帳)

2014年3月
= 0(因爲它已經在2014年1月已經入賬,因此增加了20分。 10已於2015年2月入賬)

2014年4月根據以上所述,我想要一個結果表格(如果有的話),我們需要一個結果表格,這個結果表格可以用來表示一個結果表格,這個結果表格可以用來表示一個結果表格的結果,這個結果表格可以用來表示一個結果表格。作爲

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

請注意,表的大小是巨大的1億左右條目和每日更新的基礎上。

+0

2014年1月將是​​20 + 30 + 20,不是嗎?此外,從今年1月1日至今,年初至今。您的計算結果顯示爲較新的一個月。這是什麼? –

+0

@AlexPakka:月份日期。感謝您指出了這一點。 –

+0

@AlexPakka 2014年1月將是​​20 + 30。由於每個值只應考慮一次,我們不考慮第二個20 –

回答

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)

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