SQL / VBA: как сгруппировать по финансовому году, начиная с 1-го числа месяца - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь (используя MS Access) сгруппировать некоторые данные по финансовому году, который может отличаться от календарного года.

Если бы каждый финансовый год всегда начинался с 1-го числа данного месяца, то решение было бы простым: можно просто использовать оператор if, подобный этому:

FY: IIf(Month([orderdate])<month([startFYofaCompany]);Year([orderdate])-1;Year([orderdate]))

в запросе на выборку типа

SELECT statement here AS FY, Sum(something) AS SumOfSth
GROUP BY statement here;

Однако в моем случае трудность заключается в том, что финансовый год данной компании может начинаться с даты, отличной от 1-го числа данного месяца. Я искал решение, но все считают иначе.

Буду признателен, если кто-то столкнется с такой же проблемой и сможет поделиться решением.

Edit: Там нет шаблона ре. финансовый год - база данных состоит из нескольких компаний и должна работать независимо от того, имеет ли какая-либо компания финансовый год, начинающийся 2, 3, 15 или в любой другой день любого месяца. Дата начала хранится в отдельном поле (в псевдокоде выше: startFYofaCompany).

Ответы [ 2 ]

0 голосов
/ 05 января 2019

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

Метод заключается в смещении финансовых дат в соответствии с календарным годом. Например:

FinancialYearFirstMonth = 9
FinancialYearFirstDay = 2 

Во-первых, выровняйтесь с примо месяца:

DateMonth = DateAdd("d", 1 - FinancialYearFirstDay, SomeDate)

Далее разверните, чтобы выровнять по первому году:

DateYearMonth = DateAdd("m", 1 - FinancialYearFirstMonth, DateAdd("d", 1 - FinancialYearFirstDay, SomeDate))

Если финансовый год не отстает, а опережает календарный год, добавьте 12 месяцев:

DateYearMonth = DateAdd("m", 1 - FinancialYearFirstMonth + 12, DateAdd("d", 1 - FinancialYearFirstDay, SomeDate))

Теперь вы можете иметь финансовый год и месяц и (с некоторыми ограничениями для ультимативных дат месяца) день с использованием обычных функций:

FinancialYear = Year(DateYearMonth)
FinancialMonth = Month(DateYearMonth)
FinancialDay = Day(DateYearMonth)

Конечно, месяц имен не подойдет. Если они необходимы, используйте MonthName от первоначальной даты.

0 голосов
/ 05 января 2019

Если у вас есть месяц + день, чтобы принять во внимание, то, очевидно, вам потребуются соответствующие 2 поля в вашей таблице (NOT NULL DEFAULT 1).

Как только это будет добавлено, следующий рассчитает год: year(orderDate) - IIF(dateserial(year(orderDate), startFYofaCompany_month, startFYofaCompany_day) > orderDate, 1, 0)

Добавьте это в 2 места, которые вы подготовили по вашему запросу.

...