2017-08-26 1 views
1

bekommen Wie kann ich Gesamtanzahl der Benutzer in mySQL erhalten, indem durch Monat Gruppierungwie Gesamtanzahl der Benutzer monthwise mysql

ich für Monat die Gesamtzahl der registrierten Benutzer gruppiert aufgelistet werden sollen.

Die Schwierigkeit dabei ist, dass ich alle Monate zwischen einem Bereich unbedingt mit zählen als 0 zählen, wenn es keine Daten während eines Monats gibt.

Mein Code

SELECT tots.*, @var := @var + tots.`count` as totalCount 
    FROM (
    SELECT 
     YEAR(registered) AS `year`, 
     MONTH(registered) AS `month`, 
     COUNT(*) AS `count` 
    FROM user where id = 73 
      AND registered >= '2017-01-01' 
      AND registered <= '2017-05-01' 
    GROUP BY `year`, `month` 
) 
AS tots, (SELECT @var := 0) AS inc 

Stromausgang

+------+-------+-------+-------------+ 
| Year | Month | Count | TotalCount | 
+------+-------+-------+-------------+ 
| 2017 | 01 | 1  | 1   | 
| 2017 | 04 | 4  | 5   | 
+------+-------+-------+-------------+ 

Bevorzugte Ausgangs

+------+-------+-------+-------------+ 
| Year | Month | Count | TotalCount | 
+------+-------+-------+-------------+ 
| 2017 | 01 | 1  | 1   | 
| 2017 | 02 | 0  | 1   | 
| 2017 | 03 | 0  | 1   | 
| 2017 | 04 | 1  | 2   | 
| 2017 | 05 | 0  | 2   | 
+------+-------+-------+-------------+ 

Hier Anzahl ist insgesamt neue Benutzer in diesem Monat und TotalCount ist insgesamt Benutzer bis zu diesem Monat.

Die NULL-Ergebnisse sind notwendig.

Wie konnte ich dieses Ergebnis in mySQL oder Laravel PHP erreichen?

+0

Ausgangsausgabe. Wie wäre es mit etwas Input? – Strawberry

+0

@Strawberry Ich habe dich nicht bekommen. – Rajeev

+0

Siehe [Warum sollte ich ein MCVE für eine anscheinend sehr einfache SQL-Abfrage bereitstellen] (http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for -was-scheint-zu-mir-eine-sehr-einfache-sql-Abfrage) – Strawberry

Antwort

0

Vermutlich haben Sie in jedem Monat mindestens einen Benutzer registriert. Wenn ja, können Sie bedingte Aggregation verwenden:

SELECT tots.*, (@var := @var + tots.`count`) as totalCount 
FROM (SELECT YEAR(registered) AS `year`, MONTH(registered) AS `month`, 
      SUM(id = 73) AS `count` 
     FROM user 
     WHERE registered >= '2017-01-01' AND registered <= '2017-05-01' 
     GROUP BY `year`, `month` 
    ) tots CROSS JOIN 
    (SELECT @var := 0) AS params; 

Ansonsten benötigen Sie einen Kalender-Tabelle oder eine Art und Weise der Erzeugung einer Zeile pro Monat.

+0

Danke. Dieser Code gibt auch die gleiche Ausgabe wie meine aktuelle Ausgabe. – Rajeev

+0

@ Rajeev. . . So haben Sie einige Jahr/Monat Combos waren * keine * Benutzer haben Daten, nicht nur Benutzer '73'. In diesem Fall benötigen Sie eine Kalendertabelle oder andere Möglichkeiten, um alle Monate zu generieren. –

Verwandte Themen