2016-08-02 20 views
0

私は7日間の期間内にアイテムの数を取得しようとしていますが、その7日間の最初の日付をまだ報告することができます。私がこれまでに来て最も近いTransact-SQLの週単位でグループ化

WITH w (w, n) 
AS 
(
    SELECT MIN(CAST(CreatedDate AS DATE)) 
       OVER( 
         PARTITION BY DATEPART(WEEK, CAST(CreatedDate AS DATE)) 
         ORDER BY DATEPART(WEEK, CAST(CreatedDate AS DATE)) 
        ) 
      ,COUNT(*) 
    FROM dbo.Tbl 
    WHERE 
     CreatedDate >= CAST(DATEADD(MONTH,-6,GETDATE()) AS DATE) 
    GROUP BY CAST(CreatedDate AS DATE) 
) 
SELECT w.w AS [Week of], SUM(w.n) AS [Items] 
FROM w 
GROUP BY w.w 
ORDER BY 1 DESC 

である。しかし、これは残念ながら今年の最初または最後の週のために動作しません。また、日付範囲が一年以上含まれている場合は動作しません。

この期間に最初の日付をまだ取得できている間に、7日間にグループ化する方法はありますか?

+0

代わりDATEPARTを使用するのでは、開始日から数週間のDATEDIFFを使用します。例えば – ZLK

+0

@ZLKこれは、サーバーの '@@ DATEFIRST'値が分析に必要な7日間の開始に対応する場合にのみ機能します。実際に@iamdave – iamdave

+0

。それはdatediff(day ...)/ 7でなければなりません – ZLK

答えて

1

あなたの日付の価値に基づいてあなたの週を得るには、以下を使用することができます。あなたはあなたの状況のた​​めの週の正しい日を得るために追加された日で遊ぶ必要がありますが、あなたは常に同じ開始日と終了日を保証されます。この場合、週は日曜日に始まり、土曜日に終了します。あなたがチェックし、@@DATEFIRSTを使用し、それに応じて調整値を割り当てるためのロジックに追加することができ、完全防弾ソリューションについては

declare @Date datetime 

set @Date = '20160802' 

select @Date - DATEPART(dw, @Date) + 1 as FirstDateOfWeek 
     ,@Date + (7 - DATEPART(dw, @Date)) as LastDateOfWeek 

を。

あなたは週の開始値を持っていたら、group byでそれを使用することができます。

select CreatedDate - DATEPART(dw, @Date) + 1 as FirstDateOfWeek 
     ,count(*) 
from tbl 
group by CreatedDate - DATEPART(dw, @Date) + 1 
order by FirstDayOfWeek 
関連する問題