Tâche mathématique SQL

J'ai cette table #Mytable

Product StartYear NewYear Amount ProdA 2002 2002 110.0 ProdA 2002 2003 170.0 ProdA 2003 2003 200.0 ProdB 2000 2000 45.2 ProdB 2000 2001 64.8 ProdB 2000 2003 37.0 ProdB 2001 2001 50.0 ProdB 2001 2002 75.0 ProdB 2001 2003 25.0 ProdB 2002 2002 55.0 ProdB 2002 2003 85.0 ProdB 2003 2003 100.0 

Je suis requirejs de produire la sortie ci-dessous pour un rapport

 Product StartYear NextYear Amount Comp 2000 2000 0 Comp 2000 2001 0 Comp 2000 2002 0 Comp 2000 2003 0 Comp 2001 2001 0 Comp 2001 2002 0 Comp 2001 2003 0 Comp 2002 2002 110 Comp 2002 2003 280 Comp 2003 2003 200 Non-Comp 2000 2000 45.2 Non-Comp 2000 2001 110 Non-Comp 2000 2002 110 Non-Comp 2000 2003 147 Non-Comp 2001 2001 50 Non-Comp 2001 2002 125 Non-Comp 2001 2003 150 Non-Comp 2002 2002 55 Non-Comp 2002 2003 140 Non-Comp 2003 2003 100 

J'ai utilisé la requête ci-dessous pour get la sum cumulative pour chaque produit dans un startyear donné

 SELECT Product, StartYear, NewYear, SUM(Amount) OVER (PARTITION BY StartYear ORDER BY StartYear ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Amount FROM #mytable t1 WHERE t1.Product = 'ProdB' UNION ALL SELECT Product, StartYear, NewYear, SUM(Amount) OVER (PARTITION BY StartYear ORDER BY StartYear ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Amount FROM #Mytable t1 WHERE t1.Product = 'ProdB' 

Cela me donne un set de résultats avec le montant cumulatif requirejs, mais n'inclut pas les années avec zéro. S'il vous plaît comment puis-je avoir les années avec zéro (pas de montant) dans la sortie?

Une idée de comment cela peut être fait en SQL?

Je ne sais pas si j'ai bien compris, mais si vous voulez avoir toutes les années, vous pouvez utiliser une table de pointage. Dans mon exemple, je viens de créer un CTE:

 DECLARE @tbl TABLE(Product VARCHAR(100), StartYear INT, NewYear INT, Amount DECIMAL(6,2)); INSERT INTO @tbl VALUES ('ProdA',2002,2002,110.0) ,('ProdA',2002,2003,170.0) ,('ProdA',2003,2003,200.0) ,('ProdB',2000,2000,45.2) ,('ProdB',2000,2001,64.8) ,('ProdB',2000,2003,37.0) ,('ProdB',2001,2001,50.0) ,('ProdB',2001,2002,75.0) ,('ProdB',2001,2003,25.0) ,('ProdB',2002,2002,55.0) ,('ProdB',2002,2003,85.0) ,('ProdB',2003,2003,100.0); ;WITH RunningYears AS --Years from 2000 to 2003 ( SELECT TOP 4 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + 1999 AS YearIndex FROM sys.objects ) SELECT MyProducts.* FROM ( SELECT * FROM RunningYears AS y LEFT JOIN (SELECT * FROM @tbl WHERE Product='ProdA') AS tblA ON y.YearIndex=tblA.StartYear UNION ALL SELECT * FROM RunningYears AS y LEFT JOIN (SELECT * FROM @tbl WHERE Product='ProdB') AS tblB ON y.YearIndex=tblB.StartYear ) AS MyProducts ORDER BY Product,YearIndex 

Le résultat

 YearIndex Product StartYear NewYear Amount 2000 NULL NULL NULL NULL 2001 NULL NULL NULL NULL 2002 ProdA 2002 2002 110.00 2002 ProdA 2002 2003 170.00 2003 ProdA 2003 2003 200.00 2000 ProdB 2000 2000 45.20 2000 ProdB 2000 2001 64.80 2000 ProdB 2000 2003 37.00 2001 ProdB 2001 2001 50.00 2001 ProdB 2001 2002 75.00 2001 ProdB 2001 2003 25.00 2002 ProdB 2002 2002 55.00 2002 ProdB 2002 2003 85.00 2003 ProdB 2003 2003 100.00