Я пытаюсь обновить таблицу измерения даты из таблицы отчетных лет нашей ERP-системы. Если я запускаю следующий запрос:
SELECT fcname FYName
,min(fdstart) YearStart
,max(fdend) YearEnd
,max(fnnumber) PeriodCount
FROM M2MData01.dbo.glrule GLR
GROUP BY fcname
Я получаю следующие данные:
FYName YearStart YearEnd PeriodCount
FY 2000 1/1/2000 12:00:00 AM 12/31/2000 12:00:00 AM 12
FY 2001 1/1/2001 12:00:00 AM 12/31/2001 12:00:00 AM 12
FY 2002 1/1/2002 12:00:00 AM 12/31/2002 12:00:00 AM 12
FY 2003 1/1/2003 12:00:00 AM 12/31/2003 12:00:00 AM 12
FY 2004 1/1/2004 12:00:00 AM 12/31/2004 12:00:00 AM 12
FY 2005 1/1/2005 12:00:00 AM 12/31/2005 12:00:00 AM 12
FY 2006 1/1/2006 12:00:00 AM 12/31/2006 12:00:00 AM 12
FY 2007 1/1/2007 12:00:00 AM 12/31/2007 12:00:00 AM 12
FY 2008 1/1/2008 12:00:00 AM 12/31/2008 12:00:00 AM 12
FY 2009 1/1/2009 12:00:00 AM 12/31/2009 12:00:00 AM 12
FY 2010 1/1/2010 12:00:00 AM 12/31/2010 12:00:00 AM 12
В моем случае в моей компании 12 периодов в год, что примерно соответствует месяцам. По сути, я пытаюсь создать оператор обновления для задания финансовых кварталов, который будет следовать этой логике:
1. Если PeriodCount делится на 4, то число периодов в квартале равно PeriodCount / 4.
2. Если PeriodNumber находится в первом квартале (в этом случае периоды с 1 по 3), то FiscalQuarter = 1 и т. Д. Для кварталов со 2 по 4.
Проблема в том, что я не могу гарантировать, что все используют 12 периодов, некоторые компании, которые я поддерживаю, используют другое число, например 10.
Я начал создавать следующий оператор выбора:
DECLARE @QuarterSize INT
DECLARE @SemesterSize INT
SELECT TST.Date,
CASE WHEN glr.PeriodCount % 4 = 0 THEN
-- Can Be divided into quarters. Quarter size is PeriodCount/4
set @quartersize = (GLR.PeriodCount/4)
CASE
END
ELSE 0
End
FROM m2mdata01.dbo.AllDates TST
INNER JOIN (
SELECT fcname FYName
,min(fdstart) YearStart
,MAX(fdend) YearEnd
,MAX(fnnumber) PeriodCount
FROM M2MData01.dbo.glrule GLR
GROUP BY fcname ) GLR
ON TST.DATE >= GLR.YearStart AND TST.DATE <= GLR.YearEnd
Могу ли я установить значение переменной внутри оператора case следующим образом? Какой лучший способ сделать это? Я вынужден использовать оператор курсора и проверять каждую дату в моем измерении по диапазону в таблице выше?