Séries SUM, nombre de returns et ordre par date

Désolé de restr bloqué sur cette requête, puisque j'ai datatables dans la clause order by, il me dit que je dois mettre dans un agrégat ou une clause group by? (même si je n'ai pas besoin de cette valeur globale?).

Table UserData (ID user, ventes, crédits, dateCreated)

Ma requête doit renvoyer les 10 derniers résultats:

SELECT TOP 10 COUNT (*) comme totalDays, SUM (ventes), SUM (crédits) FROM UserData WHERE nom_user = @userID ORDER BY dateCreated DESC

J'ai totalDays parce que peut-être il ne returnnera pas le # de jours que j'ai demandé (dans ce cas, il est 10, mais il peut être changé plus tard).

Cela vous donne les totaux pour les 10 derniers jours:

SELECT COUNT(*) as totalDays, SUM(sales), SUM(credits) FROM UserData WHERE userID = @userID AND DateCreated > GETDATE() - 10 

10 dernières ventes

 SELECT COUNT(*) as totalDays, SUM(sales), SUM(credits) FROM (SELECT TOP 10 sales, credits FROM UserData WHERE userID = @userID ORDER BY dateCreated DESC) X 

Il est inutile d'utiliser top ou order by sur une requête qui ne renvoie qu'une seule ligne dans le résultat. Vous devez d'abord faire en sorte que la requête renvoie plusieurs lignes pour en faire usage.

Cela va simplement agréger toutes les ventes et returnner une seule ligne, donc vous devez d'abord faire quelque chose:

 select count(*) as totalDays, sum(sales), sum(credits) from UserData where userID = @userID 

Si vous voulez prendre les dix dernières ventes et résumer, vous avez besoin d'une sous-requête qui isole d'abord les dix ventes, puis vous pouvez les agréger:

 select count(*) as totalDays, sum(sales), sum(credits) from ( select top 10 sales, credits from UserData where userID = @userID order by dateCreated desc ) LastData 

Si vous voulez résumer chaque jour un return les dix derniers jours, vous devez regrouper à la date:

 select top 10 count(*) as totalDays, sum(sales), sum(credits) from UserData where userID = @userID group by dateCreated order by dateCreated desc 

Cela se produit en raison du champ * (ALL). Puisque vous regroupez vous devriez choisir un autre champ à countr, n'importe quel champ ferait dans votre cas ce qui rendrait votre requête quelque chose comme ceci:

SÉLECTIONNEZ TOP 10 COUNT (USERID) COMME TOTALDAYS, SUM (VENTES), SUM (CREDITS) à partir de USERDATA OERE userid = @userid GROUP BY datecreated ORDER BY datecreated DESC

Même si datecreated n'est pas utilisé dans la clause SELECT, il doit toujours figurer dans la partie GROUP BY.

J'espère que cela t'aides.