开发者

(SQL) Grouping by End of week

I have a report which needs to total up the number of registrations per week, over the last ten weeks and display it as

"Week Ending October 10th, 2009" 500"

"Week Ending OCtober 3rd, 2009" 400"

"Week Ending September 26, 2009" 1000"

etc...

Here is my query:

SELECT Count(*) as [Total]
      ,Week = DateAdd(day, -1 * datepart(dw, CONVERT(varchar,Creat开发者_JAVA百科eDate,101)),    CONVERT(varchar,CreateDate,101))

FROM aspnet_membership WITH (nolock)

WHERE CreateDate BETWEEN CAST(CONVERT(varchar, DATEADD(ww, -10, DATEADD(dd, -(DATEPART(dw, GETDATE()) - 1), GETDATE())), 101) AS DATETIME)  AND
                 DateAdd(day,  -1 *  datepart(dw, CONVERT(varchar,Getdate(),101)), CONVERT(varchar,GetDate(),101))
GROUP BY DateAdd(day, -1 * datepart(dw, CONVERT(varchar,CreateDate,101)), CONVERT(varchar,CreateDate,101))
ORDER BY [Week] DESC

The between clause is doing a between 08/02/2009 and 10/10/2009 but the results don't contain any records for the week of October 10th, even though there are thousands in the DB.

I'm guessing I'm either grouping by something incorrectly, or something.

Any help would be greatly appreciated.


Your DateAdd function is actually finding the Saturday of the previous week, i.e. for 10/13/2009 it's returning 10/10/2009, for 10/7/2009 and 10/8/2009 it's returning 10/3/2009, etc. A simple +7 should fix it:

DATEADD(dd, - DATEPART(dw, CONVERT(varchar, CreateDate, 101)) + 7, CONVERT(varchar, CreateDate, 101)) 


Try the DATEPART function:

SELECT 
    datepart(week,createdate) as WeekNumber
,   count(*) as RowsPerWeek
FROM aspnet_membership WITH (nolock)
GROUP BY datepart(week,createdate)

You can calculate the end of the week using min(createdate). Would work just as well with max(createdate) or even avg(createdate).

SELECT
    DATEADD(dd, 7-(DATEPART(dw, min(createdate))), min(createdate))
      as EndOfWeek
,   count(*) as RowsPerWeek
FROM aspnet_membership WITH (nolock)
GROUP BY datepart(week,createdate)

This would return the saturday at the end of the week (the time part can still vary.)
I see from your question you already know how to format the long date.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜