2016-12-05 6 views
1

J'utilise SQL Server 2014. J'ai des revendications table contenant les totaux des réclamations par mois dans mon système:Utilisation de la fonction de fenêtrage SQL Server pour obtenir au total en cours d'exécution par l'exercice

+-----------+-------------+------------+ 
| Claim_ID | Claim_Date | Nett_Total | 
+-----------+-------------+------------+ 
| 1   | 31 Jan 2012 | 321454.67 | 
| 2   | 29 Feb 2012 | 523542.34 | 
| 3   | 31 Mar 2012 | 35344.33 | 
| 4   | 30 Apr 2012 | 142355.63 | 
| etc.  | etc.  | etc.  | 
+-----------+-------------+------------+ 

Pour une rapport J'écris que je dois être en mesure de produire un total cumulatif qui remet à zéro au début de chaque année fiscale (dans mon pays c'est du 1er mars au 28/29 de l'année suivante).

Le rapport sera similaire à la table, avec une colonne totale supplémentaire en cours d'exécution, quelque chose comme:

+-----------+-------------+------------+---------------+ 
| Claim_ID | Claim_Date | Nett_Total | Running Total | 
+-----------+-------------+------------+---------------+ 
| 1   | 31 Jan 2012 | 321454.67 |  321454.67 | 
| 2   | 29 Feb 2012 | 523542.34 |  844997.01 | 
| 3   | 31 Mar 2012 | 35344.33 |  35344.33 | (restart at 0 
| 4   | 30 Apr 2012 | 142355.63 |  177699.96 | for new yr) 
| etc.  | etc.  | etc.  |    | 
+-----------+-------------+------------+---------------+ 

Je sais que les fonctions de fenêtrage sont très puissants et je les ai utilisés de façon rudimentaire dans le passé obtenir des sommes et des moyennes globales tout en évitant de devoir regrouper mes rangées de résultats. J'ai l'intuition que je devrai utiliser le mot-clé 'précédent' pour obtenir le total cumulé pour l'année fiscale en cours dans chaque rangée, mais je ne sais pas exactement comment exprimer l'année fiscale comme un concept à utiliser dans le la clause 'précédente' (ou s'il est effectivement possible d'utiliser une plage de dates de cette manière).

Toute aide sur la façon de "phraser" l'année fiscale pour la clause "précédente" sera d'une aide précieuse pour moi, s'il vous plaît.

+1

Si vous avez une table de calendrier, vous pouvez le faire assez facilement en se joignant simplement à cette table, puis le partitionnement par FiscalYear –

+1

Am quelque chose que je manque? Est-ce que je me trompe ou avez-vous oublié de mettre un frein d'année dans votre exemple? Parce que pour autant que je puisse voir, soit le total cumulatif de ID 3 et 4 est défectueux ou ils appartiennent à une autre année ... – Tyron78

+0

Janvier et Février 2012 Appartiennent à l'exercice 2012, et Mars et Avril appartiennent à l'exercice 2013 année (année se terminant février 2013). Donc, parce que j'ai seulement Jan et Fev 2012 dans mes données, le total cumulé est le total net de Jan pour la ligne Jan, et la somme des totaux nets de Jan et Feb pour la ligne Feb. En mars (année fiscale 2013), le total cumulé est remis à zéro. En mars, il ne prend en compte que le total net de mars et le mois d'avril compte les totaux nets de mars et d'avril. J'espère que j'ai du sens et ne fais pas quelque chose d'horriblement idiot. –

Répondre

2

Je pense que vous devriez essayer ceci:

/* Create Table*/ 
CREATE TABLE dbo.Claims (
Claim_ID int 
,Claim_Date datetime 
,Nett_Total decimal(10,2) 
); 

/* Insert Testrows*/ 
INSERT INTO dbo.Claims VALUES 
(1, '20120101', 10000) 
,(2, '20120202', 10000) 
,(3, '20120303', 10000) 
,(4, '20120404', 10000) 
,(5, '20120505', 10000) 
,(6, '20120606', 10000) 
,(7, '20120707', 10000) 
,(8, '20120808', 10000) 

interroger les données:

SELECT Claim_ID, Claim_Date, Nett_Total, SUM(Nett_Total) OVER 
(PARTITION BY YEAR(DATEADD(month,-2,Claim_Date)) ORDER BY Claim_ID) AS 
[Running Total] FROM dbo.Claims 

Le Trick: PARTITION BY YEAR(DATEADD(month,-2,Claim_Date))

nouvelle partition par année, mais je change la date il correspond votre année fiscale.

Sortie:

Claim_ID |Claim_Date     |Nett_Total |Running Total 
---------+---------------------------+------------+------------- 
1  |2012-01-01 00:00:00.000 |10000.00 |10000.00 
2  |2012-02-02 00:00:00.000 |10000.00 |20000.00 
3  |2012-03-03 00:00:00.000 |10000.00 |10000.00 <- New partition 
4  |2012-04-04 00:00:00.000 |10000.00 |20000.00 
5  |2012-05-05 00:00:00.000 |10000.00 |30000.00 
6  |2012-06-06 00:00:00.000 |10000.00 |40000.00 
7  |2012-07-07 00:00:00.000 |10000.00 |50000.00 
8  |2012-08-08 00:00:00.000 |10000.00 |60000.00 
+2

Juste une courte annotation: J'ai juste essayé votre exemple, mais avec des Totaux Nett modifiés. Pour autant que je puisse voir, le frein de l'année est le 2012-04-04 et non le 2012-03-03 ... pourrait valoir la peine d'être modifié. ;-) – Tyron78