2016-10-04 6 views
1

ich eine SQL-Anfrage wie diese:Gruppe von count (*) und 0 statt leeren

SELECT date_format(`user_date_accountcreated`, "%Y-%m-%d") as date, Count(*) as total from users 
where `user_date_accountcreated` 
BETWEEN '2016-09-18 00:00:00' AND '2016-10-03 23:59:59' 
GROUP BY date_format(`user_date_accountcreated`, "%y%m%d") 

Aber wenn es keine reccords ist, ich habe leeres Ergebnis wegen GROUP BY, gibt es nichts zu gruppieren. ..

ich habe versucht, mit ISNULL wie folgt aus:

SELECT date_format(`user_date_accountcreated`, "%Y-%m-%d") as date, ISNULL(Count(*), 0) as total from users 
where `user_date_accountcreated` BETWEEN '2016-09-18 00:00:00' AND '2016-10-03 23:59:59' 
GROUP BY date_format(`user_date_accountcreated`, "%y%m%d") 

Aber ich einen SQL-Fehler: # 1582 - falsche Parameteranzahl im Aufruf von nativen Funktion 'ISNULL'

Gibt es eine Chance, 0 statt leeres Ergebnis zu erhalten, wenn wir eine GROUP BY verwenden?

+0

count() ist eine Aggregatfunktion. Das Ergebnis ist erst verfügbar, nachdem alle Zeilen berücksichtigt wurden. Sie verwenden es in einer isnull() - Funktion, die für jede Zeile ausgewertet wird. Datenbanken können keine Zeitreisen durchführen, daher können sie nicht rückwirkend einen "endgültigen" Zählwert (*) angeben, der zu dem Zeitpunkt, zu dem das Isnull tatsächlich ausgewertet wird, nicht gleich ist. und natürlich, RTFM: [isnull()] (http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_isnull) es dauert nur ein Argument, genau wie Ihr Fehler sagt. –

+0

möchten Sie wahrscheinlich [coalesce()] (http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce) stattdessen. –

+0

@MarcB Ich glaube, sein Problem ist, dass die 'WHERE'-Bedingung Datensätze vollständig filtert, so dass sein Ergebnis im Laufe der Zeit bestimmte Daten nicht enthält, weil es nicht den Kriterien entspricht. Die Überprüfung auf 0, null usw. bringt keine Früchte, weil die Aufzeichnungen einfach nicht da sind. –

Antwort

1

Verwendung bedingte Aggregation:

SELECT DATE_FORMAT(user_date_accountcreated, "%Y-%m-%d") AS date, 
     SUM(CASE WHEN user_date_accountcreated BETWEEN '2016-09-18 00:00:00' AND 
                '2016-10-03 23:59:59' 
      THEN 1 ELSE 0 END) AS total_from_users 
GROUP BY DATE_FORMAT(user_date_accountcreated, "%y%m%d") 
+0

@JaydipJ Ja, das habe ich wirklich getan, danke. –

+0

Ich bekomme seltsame Ergebnisse beginnend mit 2014-01-01 als Datum (Der Beginn der Daten in der Tabelle) bis 2014-01-25 und alle Ergebnisse sind NULL. –

+0

@LondonSmith Bitte versuchen Sie es erneut, ich habe die 'CASE' Anweisung geändert, um eine Summe von '0' zurückzugeben, wenn es keine übereinstimmenden Datensätze für eine gegebene Gruppe gibt. Zuvor hatte ich dies weggelassen, was erklären könnte, warum Sie an Orten, die Sie nicht erwartet hatten, "NULL" -Werte erhalten haben. –

0

prüfen diese

SELECT 
    date_format(`user_date_accountcreated`, "%Y-%m-%d") as date, 
    Count(date_format(`user_date_accountcreated`, "%Y-%m-%d")) as total 
from users 
where `user_date_accountcreated` 
BETWEEN '2016-09-18 00:00:00' AND '2016-10-03 23:59:59' 
GROUP BY date_format(`user_date_accountcreated`, "%y%m%d") 
+0

Keine Unterschiede, Datumsbreite keine Ergebnisse nicht angezeigt. –

0

Zunächst eine Abfrage kann nicht Datensätze zurück, die nicht da sind. Wenn Sie sie sehen möchten, müssen Sie sie generieren. Die folgende Abfrage verwendet UNION ALL, um entweder die Datensätze aus Ihrer Anfrage erhalten oder einen Rekord, wenn Ihre Abfrage keine Zeilen zurückgibt:

SELECT 
    date_format(user_date_accountcreated, '%Y-%m-%d') AS date, 
    COUNT(*) AS total 
FROM users 
WHERE user_date_accountcreated >= '2016-09-18' 
    AND user_date_accountcreated < '2016-10-04' 
GROUP BY date_format(user_date_accountcreated, '%Y-%m-%d') 
UNION ALL 
SELECT null, 0 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM users 
    WHERE user_date_accountcreated >= '2016-09-18' 
    AND user_date_accountcreated < '2016-10-04' 
); 

Das gleiche kann mit einer Klausel erreicht werden:

WITH mydates AS 
(
    SELECT 
    date_format(user_date_accountcreated, '%Y-%m-%d') AS date, 
    COUNT(*) AS total 
    FROM users 
    WHERE user_date_accountcreated >= '2016-09-18' 
    AND user_date_accountcreated < '2016-10-04' 
    GROUP BY date_format(user_date_accountcreated, '%Y-%m-%d') 
) 
SELECT date, total FROM mydates 
UNION ALL 
SELECT null, 0 WHERE NOT EXISTS (select * from mydates); 

I habe korrigiert auch zwei Fehler in Ihrer Suchanfrage:

  • Die SQL-String-Begrenzer ist ' wie in '%Y-%m-%d'.
  • Ihre Auswahlliste sollte den gleichen Wert wie in der Gruppe enthalten ('%Y-%m-%' vs. '%y%m%d'). Es funktioniert in Ihrem Fall, könnte aber in anderen Situationen Probleme verursachen.
+0

Ja, ich verstehe meine 2 Fehler. Für die Ergebnisse bekomme ich keine Daten mit 0, sie erscheinen einfach nicht. –

+1

@LondonSmith Wenn in Ihrer Originaltabelle Datensätze für bestimmte Daten fehlen, werden diese Daten in keiner der angegebenen Lösungen angezeigt. In diesem Fall müssen Sie möglicherweise eine Kalendertabelle verwenden, um fehlende Daten einzufügen. –

+0

Ja @TimBiegeleisen Ich werde das Zeug in PHP tun, anstatt einen Kalender zu verwenden. Vielen Dank :) –