1

重複の可能性:
TSQL月の週番号を計算する

これは私のSQLクエリです

 SELECT DATEPART(MONTH,PaymentDate) AS 'Month',
       DATEPART(WEEK,PaymentDate) AS 'Week #',
       SUM(COALESCE(Amount,0)) AS 'Amount',
       SUM(COALESCE(Balance,0)) AS 'Balance'
FROM Payment
WHERE     (MONTH(PaymentDate) = MONTH('2012-09-01'))
GROUP BY DATEPART(MONTH,PaymentDate),
DATEPART(WEEK,PaymentDate)
GO

ここに画像の説明を入力してください

私は毎週のように月の合計支払いを取得しようとしています。

今私は2つの問題があります

1)ご覧のとおり、その月ではなく、その年の週番号が表示されます。

2)また、4週間ではなく6週間のグループを表示します。

どうすれば修正できますか。

ありがとう。

4

3 に答える 3

5

カレンダーは非論理的であるため、日付は難しいです。

ここでのコメントではグレゴリオ暦を想定しています。

「月の週」でグループ化する場合は、最初に何が表示されるかを定義する必要があります。毎月の「第1週」をその月の初日に開始する場合、2月を除いて毎月5週間になります(4回のうち3回)。

「週」を特定の日に開始する場合は、2月を除いて、毎月5週間または6週間になります。

最初の「月の週」を1〜7日目、2番目の「週」を8〜14日目などとすると、次のようなものを使用するのが最善の策です。

CASE
    WHEN DATEPART(DAY, PaymentDate) BETWEEN 1 AND 7 THEN 1
    WHEN DATEPART(DAY, PaymentDate) BETWEEN 8 AND 14 THEN 2
    WHEN DATEPART(DAY, PaymentDate) BETWEEN 15 AND 21 THEN 3
    WHEN DATEPART(DAY, PaymentDate) BETWEEN 22 AND 28 THEN 4
    ELSE 5
END

(例えば)。

ただし、最も重要なことは、すべてのケースでどのように動作させるかを正確に定義することです。その後、クエリはそれに従うことができます。

于 2012-10-06T15:11:58.483 に答える
1

すべてのあなたの助けをありがとう、ちょうどそれを解決しました:-)

SELECT 
             SUM(Amount) AS 'Amount',
             SUM(COALESCE(Balance,0)) AS 'Balance' ,
             CASE
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 1 AND 7 THEN 1
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 8 AND 14 THEN 2
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 15 AND 21 THEN 3
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 22 AND 28 THEN 4
            ELSE 5
        END   AS MyWeek

        FROM Payment
        WHERE     (MONTH(PaymentDate) = MONTH('2012-09-01'))
        GROUP BY (CASE
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 1 AND 7 THEN 1
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 8 AND 14 THEN 2
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 15 AND 21 THEN 3
            WHEN DATEPART(DAY, PaymentDate) BETWEEN 22 AND 28 THEN 4
            ELSE 5
        END 
        )
        GO
于 2012-10-06T18:49:09.717 に答える
0

これは私があなたのクエリを書く方法です:

  SELECT DATEPART(MONTH,PaymentDate) AS 'Month',
         datepart(wk,PaymentDate)-datepart(wk,'20120901')+1 AS 'Week #',
         SUM(COALESCE(Amount,0)) AS 'Amount',
         SUM(COALESCE(Balance,0)) AS 'Balance'
    FROM Payment
   WHERE PaymentDate >= '20120901'
     AND PaymentDate <  '20121001'
GROUP BY DATEPART(MONTH,PaymentDate),
         datepart(wk,PaymentDate);

2つのエラーを修正するために、PaymentDateフィルターを範囲に変更しました:
(1)年を考慮していませんでした
(2)SARGABLEではありませんでした。つまり、PaymentDate列で関数を実行しているため、PaymentDate列のインデックス

受け入れられたソリューションでは5つのweek #値しか許可されていませんが、週は1〜7、8〜14などと定義されているため、これにより、2012年12月の月に次のように番号を付けることができます。

Sun Mon Tue Wed Thu Fri Sat   Week #
                         1     1
 2   3   4   5   6   7   8     2
 9  10  11  12  13  14  15     3
16  17  18  19  20  21  22     4
23  24  25  26  27  28  29     5
30  31                         6
于 2012-10-06T22:11:11.823 に答える