Попытка установить переменную внутри оператора case. - PullRequest
2 голосов
/ 12 августа 2010

Я пытаюсь обновить таблицу измерения даты из таблицы отчетных лет нашей 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 следующим образом? Какой лучший способ сделать это? Я вынужден использовать оператор курсора и проверять каждую дату в моем измерении по диапазону в таблице выше?

Ответы [ 2 ]

7 голосов
/ 12 августа 2010

Не уверен, что вы хотите сделать здесь - вы можете назначить переменную вне оператора case в предложении select.Например,

SELECT
   SomeCol,
   @var = CASE
     WHEN condition1 THEN some value
     WHEN condition2 THEN other value
   END,
   OtherCol
FROM
   ...

Обратите внимание, что для значения @var должно быть установлено значение, вычисленное в последней строке.Как уже говорилось ранее, я не уверен, как вы собираетесь использовать переменную @quartersize.Если значение требуется в каждой строке, тогда вообще не следует использовать переменную.

1 голос
/ 12 августа 2010

Возможно, это не самое элегантное решение, но вот что я в итоге получил.

Я связал копию деталей скрипта с группировкой по версии того же самого.

SELECT fcname FYName, fdstart PeriodStart, fdend PeriodEnd, fnnumber PeriodNo, GLRAGG.AGGFYName,
       GLRAGG.QuarterSize, GLRAGG.PeriodCount, GLRAGG.Quarterific, GLRAGG.SemesterSize, GLRAGG.Semesterific
FROM   M2MData01.dbo.glrule GLR
     INNER JOIN
       (SELECT fcname AGGFYName, min(fdstart) YearStart,
               MAX(fdend) YearEnd, MAX(fnnumber) PeriodCount,
               (Max(fnnumber) / 4) QuarterSize, CASE WHEN Max(fnnumber) % 4 = 0 THEN 'Yes' ELSE 'No' END AS Quarterific,
               (Max(fnnumber) / 2) SemesterSize, CASE WHEN Max(fnnumber) % 2 = 0 THEN 'Yes' ELSE 'No' END AS Semesterific
        FROM M2MData01.dbo.glrule
        GROUP BY fcname) GLRAGG
     ON GLR.FCNAME = GLRAGG.AGGFYNAME

Это не имеет большого значения, потому что в этой таблице только 12 строк для каждого года, в данном случае всего 132 строки.

Это производит каждый финансовый период с общим числом периодов в каждом финансовом году и может ли он быть равномерно разделен на 4 и 2. Затем он использует значение "Quarterific", чтобы определить, следует ли это делать в операторе обновления и I можно получить без использования переменных.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...