2009-10-13 6 views
1

J'ai un rapport qui doit totaliser le nombre d'inscriptions par semaine, au cours des dix dernières semaines et l'afficher comme(SQL) Regroupement par la fin de la semaine

« Semaine se terminant le 10 Octobre, 2009 » 500"

"semaine du 3 octobre 2009" 400"

"semaine se terminant le 26 Septembre 2009" 1000"

etc ...

Voici ma question:

SELECT Count(*) as [Total] 
     ,Week = DateAdd(day, -1 * datepart(dw, CONVERT(varchar,CreateDate,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 

La clause entre fait un entre 08/02/2009 et 10/10/2009, mais les résultats ne contiennent pas de dossiers pour la semaine du 10 Octobre, même bien qu'il y ait des milliers dans la DB.

Je suppose que je suis soit en train de regrouper par quelque chose de façon incorrecte, ou quelque chose.

Toute aide serait grandement appréciée.

Répondre

1

Votre fonction DateAdd trouve actuellement le samedi du précédent semaine précédente, c'est-à-dire pour le 13/10/2009 il revient 10/10/2009, pour 10/7/2009 et 08/10/2009 il revient 10/3/2009, etc. Un simple +7 devrait le réparer:

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

Formule fonctionne, mais vous vous demandez pourquoi vous CONVERT CreateDate à un champ varchar? Il semble bien fonctionner sans le CONVERT. – Andomar

+1

Je viens de copier la formule de JackM - je suppose qu'il avait une raison de faire la conversion. – Martha

1

Essayez la fonction DATEPART:

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

Vous pouvez calculer la fin de la semaine en utilisant min (createdate). Fonctionnerait aussi bien avec max (createdate) ou même 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) 

Ce serait le retour samedi à la fin de la semaine (la partie de temps peut encore varier.)
Je vois de votre question, vous savez déjà comment formater la longue date.

Questions connexes