试图在case语句中设置变量.

Dav*_*ein 2 t-sql initialization sql-server-2000 case-statement

我正在尝试从ERP系统的会计年度表中更新日期维度表.如果我运行以下查询:

SELECT fcname FYName
      ,min(fdstart) YearStart
      ,max(fdend) YearEnd
      ,max(fnnumber) PeriodCount
FROM M2MData01.dbo.glrule GLR
GROUP BY fcname
Run Code Online (Sandbox Code Playgroud)

我得到以下数据:

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
Run Code Online (Sandbox Code Playgroud)

就我而言,我的公司每年有12个时期,大致相当于几个月.基本上,我试图创建一个更新语句来设置财政季度,它将遵循这个逻辑:
1.如果PeriodCount可以被4整除,那么一个季度的周期数是PeriodCount/4.
2.如果PeriodNumber在第一季度(在这种情况下为1到3期),那么FiscalQuarter = 1,依此类推第2季度到第4季度.

问题是,我不能保证每个人都使用12个句点,我支持的一些公司使用不同的数字,如10.

我开始创建以下select语句:

    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
Run Code Online (Sandbox Code Playgroud)

我可以像这样在case语句中设置变量的值吗?实现这一目标的最佳方法是什么?我是否被迫使用游标语句并检查我的维度中的每个日期与上表中的范围?

Vin*_*ayC 7

不知道你想在这里做什么 - 你可以在select子句中分配变量外部case语句.如

SELECT
   SomeCol,
   @var = CASE
     WHEN condition1 THEN some value
     WHEN condition2 THEN other value
   END,
   OtherCol
FROM
   ...
Run Code Online (Sandbox Code Playgroud)

请注意,@ var值应设置为最后一行计算的值.如前所述,我不确定你打算如何使用@quartersize变量.如果每行都需要该值,则根本不应该使用变量.