2009-05-21 9 views
1

Sorry fest auf dieser Abfrage, da ich die Daten in der Reihenfolge by Klausel habe ich sagt, dass ich eine Aggregat oder Gruppe by Klausel setzen muss? (auch wenn ich diesen Gesamtwert nicht benötige?).SUM Zeilen, Anzahl der Rücksendungen und Reihenfolge nach Datum

Tabelle Userdata (userID, Vertrieb, Kredite, Datecreated)

Meine Anfrage hat die letzten 10 Ergebnisse zurück:

TOP 10 COUNT SELECT (*) als totalDays, SUM (Umsatz), SUM (Credits) vON Userdata userid = @userID ORDER BY DESC Datecreated

ich habe totalDays denn vielleicht wird es nicht die Anzahl der Tage kehre ich für (in diesem Fall gefragt, es ist 10, aber es kann verändert werden später).

+0

so wollen Sie nur die letzten 10 Tage insgesamt? –

+0

Geben Sie Beispieldaten und ein Beispiel dafür, was Sie von der Abfrage erhalten möchten, aus. –

Antwort

1

Dies gibt Ihnen die Summen für die letzten 10 Tage:

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

letzten 10 Verkäufe

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

dies funktioniert nur, wenn Sie davon ausgehen, dass nur ein Verkauf pro Tag passiert. Ich denke, das OP will die letzten 10 Verkäufe, nicht die letzten 10 Tage Umsatz – northpole

+0

Nein das wird die Summen für alle Datensätze in den letzten 10 Tagen sammeln –

+0

Und ja, es ist nicht klar, was das OP will –

0

Dies wegen der * (ALL) Feld geschieht. Da Sie aggregieren sollten Sie ein anderes Feld zu zählen wählen, würde jedes Feld in Ihrem Fall tun, die Ihre Abfrage etwa so aussehen würde:

SELECT TOP 10 COUNT (USERID) als GESAMTTAGE, SUM (SALES), SUM (CREDITS) VON USERDATA WHERE userid = @userid GROUP BY Datecreated ORDER BY DESC Datecreated

Auch wenn die Datecreated nicht in der SELECT-Klausel verwendet wird, es muss noch in der GROUP BY-Teil sein.

Hoffe, das hilft.

1

Es macht keinen Sinn, top oder order by für eine Abfrage zu verwenden, die nur eine einzelne Zeile im Ergebnis zurückgibt. Zuerst müssen Sie sicherstellen, dass die Abfrage mehr als eine Zeile zurückgibt, um sie zu verwenden.

Dies wird aggregieren einfach alle Verkäufe und Rück eine einzige Reihe, so dass Sie etwas damit zu tun haben zuerst:

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

Wenn Sie die letzten zehn Verkäufe nehmen wollen und zusammenzufassen, müssen Sie eine Unterabfrage dass zunächst isoliert die zehn Verkäufe, dann können Sie sie aggregieren:

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

Wenn Sie jeden Tag eine Rückkehr in den letzten zehn Tagen summieren möchten, können Sie an dem Tag Gruppe benötigen:

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