2016-08-11 4 views
0
SELECT DISTINCT 
    ACCOUNTDATE 
    ,PROPERTYNAME 
    ,rt.management 
from aaa t 
cross apply  
    (select SUM(MANAGEMENT) as management 
    from aaa 
    where 
    PROPERTYNAME = t.PROPERTYNAME and 
    ACCOUNTDATE BETWEEN dateadd(MONTH, datediff(MONTH, 0,t.ACCOUNTDATE),0) -- start of month 
AND t.ACCOUNTDATE 
    ) as rt 
WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN 
ORDER BY AccountDate 

Это запрос, чтобы найти месяц на сегодняшний день. Как найти год за отчетным годом по тому же запросу? например: общая сумма от 01.04.04/2015-31/03/2016год к году общая сумма за финансовый год

ответ

0

Не знаете, с какой даты вы должны начать FY. Предположим из @STARTOFMONTH_MAN. Затем вы можете начать FY как

declare @fymonth int = 4; -- first month of FY. 

declare @STARTOFMONTH_MAN date = '20160320'; 
select fyStart = dateadd(MONTH, 
       @fymonth - CASE WHEN month(@STARTOFMONTH_MAN) >= @fymonth THEN 1 ELSE 13 END, 
       dateadd(YEAR, datediff(YEAR, 0, @STARTOFMONTH_MAN),0)); 

Вы можете упростить эти расчеты дат, создав таблицу календаря.

EDIT
Идея ограничить данные в том, где с большим интервалом и условно SUM данных для подпериода.

declare @fymonth int = 4; -- first month of FY. 

SELECT DISTINCT 
    ACCOUNTDATE 
    ,PROPERTYNAME 
    ,rt.FYManagement, rt.MonthManagement 
FROM aaa t 
CROSS APPLY  
    (SELECT 
     SUM(t2.MANAGEMENT) AS FYManagement 
     ,SUM(CASE WHEN t2.ACCOUNTDATE BETWEEN 
       -- start of month for t.ACCOUNTDATE 
      dateadd(MONTH, datediff(MONTH, 0, t3.ACCOUNTDATE), 0) 
      AND t3.ACCOUNTDATE 
     THEN t2.MANAGEMENT END) AS MonthManagement 
    from aaa t2 
    JOIN aaa t3 ON t3.primarykey = t.primarykey -- change as needed to get 1 to 1 JOIN 
    where 
    t2.PROPERTYNAME = t.PROPERTYNAME and 
    t2.ACCOUNTDATE BETWEEN 
       -- FY start for t.ACCOUNTDATE 
       dateadd(MONTH, 
        @fymonth - CASE WHEN month(t.ACCOUNTDATE) >= @fymonth THEN 1 ELSE 13 END, 
        dateadd(YEAR, datediff(YEAR, 0, t.ACCOUNTDATE), 0)); 
       AND t.ACCOUNTDATE 
    ) as rt 
WHERE AccountDate BETWEEN @STARTOFMONTH_MAN AND @ENDOFMONTH_MAN 
ORDER BY AccountDate 
+0

спасибо за вашу помощь .. Мне нужно, чтобы начать FY с 1 апреля каждого года, и это будет динамичным. В этом запросе, например: текущее общее количество с 01/04/2015-31/03/2016 должно быть сброшено. – Swe

+0

У меня это есть. Я имею в виду, что ваш запрос зависит от параметров, которые ограничивают период. Старт FY для первого параметра может быть 01.04.2015, а второй - 01.04.2016. Следует ли это учитывать в подзапросе или нет? – Serg

+0

Да, период FY необходимо позаботиться. – Swe

0

declare @fymonth int = 4; - первый месяц FY.

SELECT DISTINCT ACCOUNTDATE , PROPERTYNAME , rt.FYManagement, rt.MonthManagement от ААА т CROSS APPLY
(SELECT SUM (t2.MANAGEMENT) КАК FYManagement , СУММА (случай, когда t2.ACCOUNTDATE МЕЖДУ - начало месяца для t.ACCOUNTDATE DateAdd (месяц, DateDiff (месяц, 0, t3.ACCOUNTDATE), 0) И t3.ACCOUNTDATE ТОГДА t2.MANAGEMENT КОНЕЦ) КАК MonthManagement от ааа t2 РЕГИСТРИРУЙТЕСЬ ааа t3 ON t3.primarykey = t .primarykey - изменение по мере необходимости, чтобы получить 1 к 1 РЕГИСТРИРУЙТЕСЬ где t2.PROPERTYNAME = t.PROPERTYNAME и t2.ACCOUNTDATE МЕЖДУ - начало FY для t.ACCOUNTDATE DateAdd (МЕСЯЦ, @fymonth - случай, когда месяц (t.ACCOUNTDATE)> = @fymonth THEN 1 ELSE 13 END, dateadd (YEAR, датированный (YEAR, 0, t.ACCOUNTDATE), 0)); И t.ACCOUNTDATE ) в к.т. ГДЕ AccountDate МЕЖДУ @STARTOFMONTH_MAN И @ENDOFMONTH_MAN ORDER BY AccountDate

 Смежные вопросы

  • Нет связанных вопросов^_^