0

会計期間の開始日と終了日を保持するテーブルがあります。

CHARGE_PERIOD_ID    START_DATE                 END_DATE
13                  2013-03-31 00:00:00.000    2013-04-27 00:00:00.000
14                  2013-04-28 00:00:00.000    2013-05-25 00:00:00.000
15                  2013-05-26 00:00:00.000    2013-06-29 00:00:00.000
16                  2013-06-30 00:00:00.000    2013-07-27 00:00:00.000
17                  2013-07-28 00:00:00.000    2013-08-24 00:00:00.000
18                  2013-08-25 00:00:00.000    2013-09-28 00:00:00.000
19                  2013-09-29 00:00:00.000    2013-10-26 00:00:00.000
20                  2013-10-27 00:00:00.000    2013-11-23 00:00:00.000
21                  2013-11-24 00:00:00.000    2013-12-28 00:00:00.000
22                  2013-12-29 00:00:00.000    2014-01-25 00:00:00.000
23                  2014-01-26 00:00:00.000    2014-02-22 00:00:00.000
24                  2014-02-23 00:00:00.000    2014-03-29 00:00:00.000

レポートのユーザーは、現在の会計年度を 12 の期間に分割し、SQL に入る年と期間番号の 2 つのパラメーターをレポートに入力したいと考えています。したがって、 @year=2014 @period=1 のようなものが recieved になります。このテーブルに移動し、期間開始日を 2014 年 3 月 31 日、期間終了日を 2014 年 4 月 27 日に設定するには、いくつかの SQL を作成する必要があります。

したがって、擬似コードでは:

2014 年の期間 1 を検索し、返品期間の開始日が 2014 年 3 月 31 日、期間の終了日が 2014 年 4 月 27 日であることを確認します。

@PERIOD_START_DATE = 特定の年の 3 月に始まる最初の期間を選択します。すべての会計期間は 3 月に始まります。

@PERIOD_END_DATE = テーブルから対応する END_DATE を選択します。

問題は、これまたは私の設計アプローチのコーディングをどのように開始するかです。これを計算する関数を作成する必要がありますか、それとも CTE を実行して、必要な方法で期間番号を保持する列を追加する必要があります。

もっと考えてみると、マッピングテーブルが必要だと思います。だから本当の問題は、マッピングテーブルなしでこれを行うことができるかということです?

4

1 に答える 1

1
DECLARE @Year INT 
DECLARE @Period INT

SET @Year= 2013
SET @Period = 1


;WITH CTE AS 
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY 
                                CASE WHEN MONTH([START_DATE])<3 THEN YEAR([START_DATE]) -1 ELSE YEAR([START_DATE]) END                              
                                ORDER BY 
                                CASE WHEN MONTH([START_DATE])<3 THEN YEAR([START_DATE]) - 1 ELSE YEAR([START_DATE]) END
                                ,CASE WHEN MONTH([START_DATE])<3 THEN MONTH([START_DATE]) + 12 ELSE MONTH([START_DATE]) END 
                                ) AS RN
FROM Periods
)
SELECT * FROM CTE
WHERE RN = @Period 
AND CASE WHEN MONTH([START_DATE])<3 THEN YEAR([START_DATE]) -1 ELSE YEAR([START_DATE]) END = @Year

SQLFiddle デモ

于 2013-04-23T22:29:53.637 に答える