2

我正在尝试从我们的 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 语句中设置变量的值吗?实现这一目标的最佳方法是什么?我是否被迫使用游标语句并根据上表中的范围检查维度中的每个日期?

4

2 回答 2

7

不确定您想在这里做什么 - 您可以在 select 子句中的 case 语句之外分配变量。如

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

请注意,@var 值设置为在最后一行评估的值。如前所述,我不确定您打算如何使用 @quartersize 变量。如果每一行都需要该值,那么您根本不应该使用变量。

于 2010-08-12T13:05:07.043 回答
1

它可能不是最优雅的解决方案,但这是我最终得到的。

我将脚本详细信息的副本链接到按版本分组的同一事物。

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”值来确定是否在更新语句中这样做,我可以得到不使用变量。

这可能不是最好的方法,但在小数据集的情况下它可以工作并且性能很好。

于 2010-08-12T17:03:55.460 回答