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 四半期 (この場合は期間 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 に答える