2010-08-12 25 views
2

我试图从ERP系统的会计年表中更新日期维度表。如果我运行下面的查询:试图在case语句中设置一个变量。

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通过4.

的问题是在第一季度(在这种情况下周期1〜3)然后FiscalQuarter = 1等为四分之三2是我不能保证每个人都使用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 

我可以设置这样的case语句里面一个变量的值?什么是实现这一目标的最佳方式?我是否强制使用游标语句,并根据上表中的范围检查我的维度中的每个日期?

+0

在你的例子中,我会小心GLR的两次使用。一般来说,仍然在思考你的问题。 – Tobiasopdenbrouw 2010-08-12 12:59:48

+0

您有一个变量(@QuarterSize)和多行(即使PeriodCount在每个行中都相同)。你打算使用@QuarterSize,你想用哪一行来计算它? – 2010-08-12 13:01:21

回答

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整除。然后使用“季度”值确定是否在更新声明中执行此操作,并且我可以通过不使用变量来获得。

它可能不是最好的方法,但它的工作原理和高性能给定了小数据集。

7

不确定你想在这里做什么 - 你可以在select子句中为case语句指定变量。如

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

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