2016-05-29 8 views
-1

Ich habe es mehrere Male gegeben, aber es scheint nicht zu funktionieren. Ist das möglich? Unten ist das, was mein aktueller Versuch ist:Wie SUM() -Funktion innerhalb eines gemeinsamen Tabellenausdrucks (CTE)

With PrintsPerDayPerEmp(ID,[Month],[Day],[Year], [Number Of Prints]) 
AS 
(Select ID, 
    datepart(month,Agent_Local_Time) as [Month], 
    datepart(day,Agent_Local_Time) as [Day], 
    datepart(year,Agent_Local_Time) as [Year], 
    count(RowID) as [Number of Prints] 
From Table1 
Where Agent_Local_Time >= (getdate()-90) 
Group by datepart(day,Agent_Local_Time), 
    datepart(month,Agent_Local_Time), 
    datepart(year,Agent_Local_Time), 
    ID 
) 
select * 
from PrintsPerDayPerEmp 
where [Number Of Prints] > (sum([Number Of Prints])/90)*3 
order by ID desc 
+0

uns So zeigen Sie Ihre 'goes', was genau erwarten Sie uns zu tun? – sagi

+0

Entschuldigung :) Hinzugefügt. – RoflWaffle17

+0

Ich denke, diese Logik hier würde mir natürlich die Summe der gesamten Spalte als eine Zahl geben, aber ich möchte es die Summe für jeden gefundenen ID zeigen .... wenn das Sinn macht. – RoflWaffle17

Antwort

0

Ich nehme an, Sie SQL Server aufgrund der getdate()-Funktion verwenden.

Ich bin mir nicht sicher, warum Sie versuchen, ein CTE zu verwenden. Es scheint völlig unnötig zu sein.

Meine Vermutung ist, dass Sie Summe (Anzahl (RowID)) insgesamt erwarten, aber das ist nicht, wie Aggregatfunktionen funktionieren. Die GROUP BY-Klausel wirkt sich auf alle Aggregatfunktionen aus.

Meine Vermutung ist, dass dies das ist, was Sie wollen. Es nutzt die OVER() Klausel Aggregation zu steuern und eine Gesamtsumme zu erhalten:

Select Id, 
    datepart(month,Agent_Local_Time) as 'Month', 
    datepart(day,Agent_Local_Time) as 'Day', 
    datepart(year,Agent_Local_Time) as 'Year', 
    count(RowID) as 'Number Of Prints', 
    count(RowID) over() as 'Print Sum' 
From Table1 
Where Agent_Local_Time >= (getdate()-90) 
Group by datepart(day,Agent_Local_Time), 
    datepart(month,Agent_Local_Time), 
    datepart(year,Agent_Local_Time), 
    Id 
Order by Id desc 

Oder diese:

Select Id, 
    datepart(month,Agent_Local_Time) as 'Month', 
    datepart(day,Agent_Local_Time) as 'Day', 
    datepart(year,Agent_Local_Time) as 'Year', 
    count(RowID) as 'Number Of Prints', 
    count(RowID) over (partition by Id) as 'Print Sum' 
From Table1 
Where Agent_Local_Time >= (getdate()-90) 
Group by datepart(day,Agent_Local_Time), 
    datepart(month,Agent_Local_Time), 
    datepart(year,Agent_Local_Time), 
    Id 
Order by Id desc 

aber ohne einige Daten und die erwarteten Ergebnisse, es ist sehr schwer zu sagen.

+0

Danke an alle, die versuchen zu helfen - es war a langes Wochenende mit Urlaub, also konnte ich nicht so viel darauf antworten/arbeiten. Aber im Grunde ist das Ergebnis, das ich versuche zu finden, das folgende: 1. Gibt jede ID und ihre tägliche Druckzählung zurück, wo ihr täglicher Druck> 3x den ID-Druck avg für die letzten 90 Tage zählt. Im Moment gibt meine Abfrage jede ID, jeden Monat/Tag/Jahr und jede Anzahl von IDs, die innerhalb der letzten 90 Tage gefunden wurden, zurück ... Das Problem ist, dass ich den 90-Tage-Durchschnitt nicht sehen kann für einen bestimmten Tag ist ihre Druckanzahl 3x mehr als der Durchschnitt. Macht das mehr Sinn? – RoflWaffle17

0

Verwenden Sie keine einfachen Anführungszeichen für Spaltenaliase. Verwenden Sie nur einfache Anführungszeichen für String- und Datumskonstanten. In SQL Server ist das richtige Escapezeichen doppelte Anführungszeichen oder eckige Klammern.

Zweitens ist die group by alles falsch.

Ich denke, das im Grunde die Abfrage Sie wollen, vorausgesetzt, dass id die Mitarbeiter-ID ist:

With PrintsPerDayPerEmp([Id],[Month],[Day],[Year], [Number Of Prints], [Print Sum]) 
AS (
     Select Id, datepart(month, Agent_Local_Time) as [Month], 
      datepart(day, Agent_Local_Time) as [Day], 
      datepart(year, Agent_Local_Time) as [Year], 
      count(RowID) as [Number of time per Day], 
      sum(count(RowID)) over() as [Print Sum] 
     From Table1 
     Where Agent_Local_Time >= (getdate() - 90) 
     Group by datepart(day, Agent_Local_Time), 
       datepart(month, Agent_Local_Time), 
       datepart(year, Agent_Local_Time), 
       Id 
    ) 
select * 
from PrintsPerDayPerEmp 
order by Id desc; 
+0

Mein neuester Versuch wurde in den ursprünglichen Beitrag des Codes bearbeitet. – RoflWaffle17

+0

@ RoflWaffle17. . . Sie haben die Logik der Abfrage geändert.Sie können Aggregationsfunktionen nicht in einer where-Klausel verwenden. Entferne das 'wo' und die Frage wird beantwortet. Wenn Sie ein anderes Bedürfnis haben, stellen Sie eine andere Frage. –