2016-12-05 9 views
1

Я использую SQL Server 2014. У меня есть претензий таблица, содержащая итоги претензий в месяц в моей системе:Использование SQL оконную функцию сервера, чтобы получить текущую сумму на финансовый год

+-----------+-------------+------------+ 
| 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.  | 
+-----------+-------------+------------+ 

Для доклад, который я пишу, мне нужно создать совокупный общий итог, который сбрасывается до нуля в начале каждого финансового года (в моей стране это с 1 марта по 28 февраля следующего года).

Отчет будет похож на стол, с дополнительным управлением общей колонкой, что-то вроде:

+-----------+-------------+------------+---------------+ 
| 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.  |    | 
+-----------+-------------+------------+---------------+ 

Я знаю оконные функции являются очень мощными, и я использовал их в зачаточных способах в прошлом получать общие суммы и средние значения, избегая необходимости группировать строки результатов. У меня есть интуиция, что мне нужно будет использовать ключевое слово «previous», чтобы получить текущую итоговую сумму за текущий финансовый год, в который попадает каждая строка, но я не могу понять, как выразить финансовый год как концепцию, используемую в 'previous' (или, если возможно, так можно использовать диапазон дат).

Любая помощь на пути «фразировки» финансового года для «предшествующей» статьи окажет огромную помощь мне, пожалуйста.

+1

Если у вас есть таблицы календаря вы можете сделать это довольно легко, просто присоединиться к этой таблице, а затем разбиения на FiscalYear –

+1

я упускаю что-то? Я ошибаюсь, или вы забыли поставить в свой пример летний тормоз? Поскольку, насколько я могу судить, либо общее количество ID 3 и 4 является неисправным, либо относится к другому году ... – Tyron78

+0

Январь и февраль 2012 года Принадлежащие к 2012 финансовому году, а март и апрель относятся к фискальной год (год, закончившийся февраль 2013 г.). Так что, поскольку у меня есть только янв и февраль 2012 года в моих данных, итоговая сумма - это нетто-сумма Ян для строки Jan, а сумма итогов нетто в январе и феврале для строки Feb. За март (в текущем 2013 финансовом году) общая сумма сбрасывается до нуля, поэтому в марте она учитывает только мартовскую сумму нетто, а апрель подсчитывает итоговые суммы нетто в марте и апреле. Надеюсь, у меня есть смысл, и я не делаю что-то ужасно идиотское. –

ответ

2

я думаю, вы должны попробовать это:

/* 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) 

Запрос данных:

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 

Уловка: PARTITION BY YEAR(DATEADD(month,-2,Claim_Date))

Новый раздел в год, но я изменить дату, так что подходит ваш финансовый год.

Выход:

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

Просто короткая аннотация: я просто попробовал ваш пример, но с измененными итогами Nett. Насколько я мог видеть, тормоз на год 2012-04-04, а не на 2012-03-03 ... может стоить изменить. ;-) – Tyron78