Frage

Gibt es einen einfachen Weg, um eine GROUP BY DATE(timestamp) zu tun, die alle Tage in einem Zeitraum umfasst, unabhängig davon, ob es irgendwelche Aufzeichnungen im Zusammenhang mit diesem Datum?

Im Grunde genommen, ich brauche einen Bericht wie folgt zu generieren:

24 Dec - 0 orders
23 Dec - 10 orders
22 Dec - 8 orders
21 Dec - 2 orders
20 Dec - 0 orders
War es hilfreich?

Lösung

Stattdessen GROUP BY verwenden, stellen Sie eine Tabelle (vielleicht eine temporäre Tabelle), die die spezifischen Daten enthält, die Sie wollen, zum Beispiel:

24 Dec
23 Dec
22 Dec
21 Dec
20 Dec

Dann kommt die Tabelle auf die Tabelle Orders.

Andere Tipps

Angenommen, Sie haben mehr Aufträge als Daten so etwas wie dies funktionieren könnte:

select date, count(id) as orders
from
(
  SELECT DATE_ADD('2008-01-01', INTERVAL @rn:=@rn+1 DAY) as date from (select @rn:=-1)t, `order` limit 365
) d left outer join `order` using (date)
group by date

Eine Methode ist, eine Kalender-Tabelle zu erstellen und kommt dagegen.

Ich würde es dauerhaft schaffen, und dann eine neue Aufgabe erstellen, die neuen Termine einfügen wird, könnte es wöchentlich erfolgen, täglich, monatlich, etc.

Beachten Sie, dass ich gehe davon aus, dass Sie Ihre Zeitstempel in ein Datum konvertieren.

Sie müssen ein Zwischenergebnis mit allen Terminen in ihm gesetzt erzeugen, dass Sie in der Ausgabe enthalten sein sollen ...

Wenn Sie dies in einer gespeicherten proc tun, dann könnte man eine temporäre Tabelle oder Tabellenvariable erstellen (I knoiw nicht MySQL-Funktionen), aber sobald Sie haben alle Daten in einer Tabelle oder des Suchresultates von einer Art

Schließe Dich der realen DATA A aus der temporären Tabelle, indem eine äußere Verknüpfung

In SQL Server würde es so sein

  Declare @Dates Table (aDate DateTime Not Null)
  Declare @StartDt DateTime Set @StartDt = 'Dec 1 2008'
  Declare @EndDt   DateTime Set @EndDt   = 'Dec 31 2008'
  While @StartDt < @EndDt Begin
    Insert @Dates(aDate) Values(@StartDt)
    Set @StartDt = DateAdd(Day, 1, @StartDt)
  End

   Select D.aDate, Count(O.*) Orders
   From @Dates D Left Join 
      OrderTable O On O.OrderDate = D.aDate
   Group By D.aDate

In einem Data Warehouse, genommen ist die Methode eine Tabelle zu erstellen, die alle Daten enthalten und einen Fremdschlüssel zwischen den Daten und der Zeitpunkt Tabelle erstellen. Ich sage nicht, dass dies der beste Weg ist, in Ihrem Fall zu gehen, nur, dass es die beste Praxis in Fällen, in denen große Datenmengen müssen in vielfältiger Weise für die Berichterstattung aufgerollt werden.

Wenn Sie eine Berichtsschicht über SQL Server verwenden, können Sie nur eine gewisse Logik schreiben, die fehlenden Daten innerhalb des Bereichs von Interesse, nachdem die Daten wieder einzufügen und vor Ihrem Bericht zu machen.

Wenn Sie Ihre Berichte direkt von SQL Server erstellen und Sie nicht bereits über einen Data Warehouse und es ist nicht die Zeit oder benötigen erstellen gerade jetzt, würde ich ein Datum Tabelle erstellen und ihn beizutreten. Die Formatierung erforderlich machen die Verbindung und erhalten Sie die Ausgabe, die Sie ein bisschen wackelig kann sein wollen, aber es wird den Job zu erledigen.

Es ist eine ziemlich einfache Art und Weise, dies zu tun ... außer, dass ich es nicht mehr erinnern kann. Aber ich angepasst diese Abfrage von diesen Thread :

SELECT 
    DISTINCT(LEFT(date_field,11)) AS `Date`,
    COUNT(LEFT(date_field,11)) AS `Number of events`
FROM events_table
GROUP BY `Date`

Es funktioniert in MySQL zu

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top