2014-10-20 51 views
0

我試圖找到每年年總的項目在多年

總例如

Start date End Date Total Value 
1 07/01/14 01/01/15 $10,000 
2 08/01/13 12/01/14 $10,000 
3 03/01/13 05/01/15 $10,000 

正如你可以看到,有些項目在多個年。有沒有辦法找出每年的總價值?

解決方案應該是:

item 3 
2013- $3600 
2014-$4800 
2015-1600 

然後求和將下降爲所有三個項目給予每年總。

我到目前爲止: 我有一個滾動求和碼,如下所示。

case when 
    (
    [begin date] >= dateadd(mm,0,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) 
    and [end date] >= dateadd(mm,0,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) 
) 
    OR 
    (
    [Begin Date] < dateadd(mm,0,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) 
    and [End Date] >= dateadd(mm,0,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) 
) 
then [Totalvalue]/nullif(DATEDIFF(mm,[begin date],[end date]),0) 
else 0 
end [Current Month] 
+0

您的滾動求和代碼不起作用嗎?它產生了什麼? – acfrancis 2014-10-20 15:26:06

回答

0

我DONO你是怎麼說的第3項

,但總價值爲3項,我希望它應該是

2013 = 3704 
2014 = 4444 
2015 = 1852 

DONO這個代碼是如何有效地只是有一個嘗試

CREATE TABLE #tblName 
    (
    itemid INT, 
    startdate DATETIME, 
    endate DATETIME, 
    value  int 
) 

INSERT INTO #tblName 
VALUES  (1,'2014/07/01','2015/01/01',10000), 
      (2,'2013/08/01','2014/12/01',10000), 
      (3,'2013/03/01','2015/05/01',10000) 

DECLARE @mindate DATETIME, 
     @maxdate DATETIME 

SELECT @mindate = Min(startdate), 
     @maxdate = Max(endate) 
FROM #tblName 

SELECT * 
FROM #tblName; 


WITH cte 
    AS (SELECT @mindate startdate 
     UNION ALL 
     SELECT Dateadd(mm, 1, startdate) startdate 
     FROM cte 
     WHERE startdate <= Dateadd(mm, -1, @maxdate)) 
SELECT a.value * ((convert(numeric(22,6),a.cnt)/convert(numeric(22,6),c.total)) * 100)/100,a.itemid,a.startdate 
FROM (SELECT Avg(value)  value, 
       Count(1)   cnt, 
       itemid, 
       Year(a.startdate) startdate 
     FROM cte a 
       JOIN #tblName b 
       ON a.startdate BETWEEN b.startdate AND b.endate 
     GROUP BY itemid, 
        Year(a.startdate)) a 
     JOIN(SELECT Sum(cnt) total, 
        itemid 
      FROM (SELECT Avg(value)  value, 
          Count(1)   cnt, 
          itemid, 
          Year(a.startdate) startdate 
        FROM cte a 
          JOIN #tblName b 
          ON a.startdate BETWEEN b.startdate AND b.endate 
        GROUP BY itemid, 
           Year(a.startdate)) B 
      GROUP BY itemid) C 
     ON a.itemid = c.itemid 
WHERE a.itemid = 3