1

週ごとのカウントを取得できません。つまり、7 日で出荷された注文を 1 週間として計算できません。次のようにクエリを確認してください。

Declare @CurrentDate nvarchar(50);
SET @CurrentDate='2012-07-25'

BEGIN 

;WITH DateList AS
(
    SELECT  DATEADD(WEEK, 0, CONVERT(DATETIME, @CurrentDate)) AS CreateDateTime, 1 AS Cnter
    UNION ALL
    SELECT  DATEADD(WEEK, -1, CreateDateTime), DateList.Cnter + 1
    FROM DateList
    WHERE DateList.Cnter  < 5
)
SELECT  DateList.CreateDateTime AS ShipWeek, COALESCE(Temp.TotalCount, 0) AS TotalCount
FROM DateList
LEFT JOIN  
(
    SELECT  COUNT(Id) TotalCount
        ,DATEADD(WEEK, DATEDIFF(WEEK, '19000101',CreatedDateTime),'19000101') AS ShipWeek
    FROM ShipmentDetail 
    WHERE CreatedDateTime
    BETWEEN DATEADD(DAY,-30,@CurrentDate) AND @CurrentDate
    GROUP BY  DATEADD(WEEK, DATEDIFF(WEEK, '19000101',CreatedDateTime),'19000101') 
) Temp
    ON CONVERT(VARCHAR(10), DateList.CreateDateTime, 112) = Temp.ShipWeek
END

結果表は次のとおりです。

ShipWeek                TotalCount
2012-07-25 00:00:00.000 0
2012-07-18 00:00:00.000 0
2012-07-11 00:00:00.000 0
2012-07-04 00:00:00.000 0
2012-06-27 00:00:00.000 0

正確な解決策を教えてください。

現在の日付を次のように入力すると:

SET @CurrentDate='2012-07-30'

結果テーブルは次のようなデータを提供します。

ShipWeek                TotalCount
2012-07-30 00:00:00.000 0
2012-07-23 00:00:00.000 1406
2012-07-16 00:00:00.000 0
2012-07-09 00:00:00.000 0
2012-07-02 00:00:00.000 0

のように現在の日付を入力すると取得できないのはなぜですか'2012-07-27'

4

1 に答える 1

2

日付を必要な精度に切り詰めるのではなく、範囲を使用すると、はるかに簡単になります。範囲を生成するように cte を変更し、派生テーブルを削除しました。現在、クエリはインデックスを使用している可能性があります。ああ、CreatedDateTime を 30 日間に絞り込む追加条件についてはよくわかりません。最初の 1 週間で一部の出荷が失われます。

Declare @CurrentDate datetime
SET @CurrentDate='2012-07-25'
;WITH DateList AS
(
    SELECT  DATEADD(WEEK, 0, CONVERT(DATETIME, @CurrentDate)) AS StartRange, 
            DATEADD(WEEK, 1, CONVERT(DATETIME, @CurrentDate)) AS EndRange, 
            1 AS Cnter
    UNION ALL
    SELECT  DATEADD(WEEK, -1, StartRange), 
            DATEADD(WEEK, -1, EndRange), 
            DateList.Cnter + 1
    FROM DateList
    WHERE DateList.Cnter  < 5
)
SELECT  DateList.StartRange AS ShipWeek, 
        COALESCE(count(ShipmentDetail.CreatedDateTime), 0) AS TotalCount
FROM DateList
LEFT JOIN ShipmentDetail
    ON DateList.StartRange <= ShipmentDetail.CreatedDateTime
   AND DateList.EndRange > ShipmentDetail.CreatedDateTime
   AND ShipmentDetail.CreatedDateTime 
       BETWEEN DATEADD(DAY,-30,@CurrentDate) 
                   AND @CurrentDate
GROUP BY DateList.StartRange;

Sql Fiddle with example はこの方法です。

于 2012-08-14T10:46:00.367 に答える