Fügen Sie zwei Zähler datename Abfragen hinzu

Abfrage

SELECT DATENAME(dw, O1.CreationDateTime) AS 'Day of the week', DATENAME(hh, O1.CreationDateTime) AS hour, COUNT(*) AS 'Nr. Orders' FROM Orders AS O1 WHERE O1.CreationDateTime >= '2015-10-01' GROUP BY DATENAME(dw, O1.CreationDateTime), DATENAME(hh, O1.CreationDateTime) ORDER BY [Day of the week], CAST(DATENAME(hh, O1.CreationDateTime) as int) 

Gibt die Gesamtzahl der Aufträge für jede Stunde eines jeden Wochentages an

Ergebnis

 Weekday Hour Nr.Orders Friday 0 10 Friday 1 11 Friday 2 2 

Das Ziel ist es, die Anzahl der Bestellungen für jede Stunde des Tages zu erhalten. Doch einige Tage haben keine Befehle, diese Tage sollten nicht gezählt werden. Um dieses Problem zu lösen, schrieb ich die auserwählte Abfrage unten.

Abfrage

 SELECT DATENAME(dw,Formatteddate.Date) AS "Day of the week", COUNT(*) AS "Weekdays in period" FROM (SELECT DISTINCT ((CONVERT (date,O2.CreationDateTime,112))) AS Date FROM Orders AS O2 WHERE O2.CreationDateTime >= '2015-10-01' ) AS Formatteddate GROUP BY DATENAME(dw,Formatteddate.Dates) 

Es zählt zum Beispiel die Anzahl der Freitags mit Aufträgen wie unten gezeigt.

Ergebnis

 Day of the week | Week days in period (with order) Friday 32 Monday 30 Saturday 21 

Grundsätzlich meine Fragen ist, wie zwei merge diese beiden Abfragen, die ich verwendet äußere gelten als Workaround. Allerdings ist es sehr langsam wegen der Tatsache, dass es jede Zeile überprüft. Ich denke, ich muss die Over-Klausel verwenden, aber ich habe keine Ahnung, wie mit der dataame-function.

Das Endergebnis sollte so aussehen, um das Zählen des Durchschnitts einfach zu machen.

 Weekday Hour Nr.Orders Weekdays in period Friday 0 10 32 Friday 1 11 32 Friday 2 2 32 Friday 3 2 32 

Sie können an den beiden Tischen zusammen am Tag der Woche teilnehmen:

 SELECT t1.[Day of the week] AS Weekday, t1.hour, t1.[Nr. Orders], COALESCE(t2.[Weekdays in period], 0) FROM ( SELECT DATENAME(dw, O1.CreationDateTime) AS 'Day of the week', DATENAME(hh, O1.CreationDateTime) AS hour, COUNT(*) AS 'Nr. Orders' FROM Orders AS O1 WHERE O1.CreationDateTime >= '2015-10-01' GROUP BY DATENAME(dw, O1.CreationDateTime), DATENAME(hh, O1.CreationDateTime) ) t1 LEFT JOIN ( SELECT DATENAME(dw,Formatteddate.Date) AS "Day of the week", COUNT(*) AS "Weekdays in period" FROM ( SELECT DISTINCT CONVERT (date,O2.CreationDateTime, 112) AS Date FROM Orders AS O2 WHERE O2.CreationDateTime >= '2015-10-01' ) AS Formatteddate GROUP BY DATENAME(dw,Formatteddate.Dates) ) t2 ON t1.[Day of the week] = t2.[Day of the week] 

Versuchen Sie, sich am Tag anzuschließen:

 WITH DayO AS ( SELECT DATENAME(dw,Formatteddate.Date) AS DayOfWeek, COUNT(*) AS PeriodDays FROM (SELECT DISTINCT ((CONVERT (date,O2.CreationDateTime,112))) AS Date FROM Orders AS O2 WHERE O2.CreationDateTime >= '2015-10-01' ) AS Formatteddate GROUP BY DATENAME(dw,Formatteddate.Dates) ) , HourO AS ( SELECT DATENAME(dw, O1.CreationDateTime) AS DayOfWeek, DATENAME(hh, O1.CreationDateTime) AS OrdHour, COUNT(*) AS NumOrd FROM Orders AS O1 WHERE O1.CreationDateTime >= '2015-10-01' GROUP BY DATENAME(dw, O1.CreationDateTime), DATENAME(hh, O1.CreationDateTime) ORDER BY [DayOfWeek], CAST(DATENAME(hh, O1.CreationDateTime) as int) ) SELECT ho.DayOfWeek as Weekday, ho.OrdHour as Hour, ho.NumOrd as [Nr. Orders], DayO.PeriodDays as [Weekdays in period] from HourO ho inner join DayO on ho.DayOfWeek = DayO.DayOfWeek