2017-10-31 1 views
-2

Ich habe Problem auf meinem SQL-Code, Hier ist der Code:SQL PHP Zähldaten zwischen zwei Datum für Tag Gruppe und zeigt jeden Tag Rekord

SELECT 
COUNT(CASE WHEN ItemState = 1 THEN 1 ELSE NULL END) AS C1, 
COUNT(CASE WHEN ItemState = 3 THEN 1 ELSE NULL END) AS C2, 
COUNT(CASE WHEN ItemState = 5 THEN 1 ELSE NULL END) AS C3, 
COUNT(CASE WHEN ItemState = 7 THEN 1 ELSE NULL END) AS C4, 
COUNT(CASE WHEN ItemState = 10 THEN 1 ELSE NULL END) AS C5, 
DAY(LastUpdate) AS Day 
FROM purchasehistory 
WHERE ItemID=77 
AND LastUpdate BETWEEN "2017-10-25 00:00:00" AND "2017-10-30 23:59:59" 
GROUP BY Day 
ORDER BY LastUpdate 
LIMIT 5 

Die Zahl Aussage ist Arbeit, aber das Ergebnis ist nicht was ich

Here is the result

enter image description here

wollte Es sollte fünf Rekord zeigen, wo Tag gleich 25, 26, 27, 28, 29, 30

Aber wenn c1, c2, c3, c4 und c5 alle gleich 0 sind es nicht zeigen, die Zeile anstatt zu zeigen, all 0

Wie das Problem zu lösen?

+0

Markieren Sie Ihre Frage mit der Datenbank, die Sie verwenden. –

+0

Das liegt daran, dass in diesem Fall wahrscheinlich keine Zeile zurückgegeben wurde, sodass Sie keine Daten anzeigen können. –

+0

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

Antwort

2

Ich finde, dass eine einfache Möglichkeit, dies in vielen Fällen zu beheben ist es, einige Filterbedingungen in die case Bedingungen zu bewegen:

SELECT SUM(ItemID = 77 AND ItemState = 1) AS C1, 
     SUM(ItemID = 77 AND ItemState = 3) AS C2, 
     SUM(ItemID = 77 AND ItemState = 5) AS C3, 
     SUM(ItemID = 77 AND ItemState = 7) AS C4, 
     SUM(ItemID = 77 AND ItemState = 10) AS C5, 
     DAY(LastUpdate) AS Day 
FROM purchasehistory 
WHERE LastUpdate >= '2017-10-25' AND LastUpdate < '2017-10-31' 
GROUP BY Day 
ORDER BY MIN(LastUpdate) 
LIMIT 5; 

Dies setzt voraus, dass es mindestens ein Produkt an jedem Tag.

Die typischere Lösung ist die Verwendung eines LEFT JOIN - und das kann leistungsfähiger sein. Ich finde nur, dass der obige Ansatz ein schnellerer Weg ist, um die gewünschten Ergebnisse zu erzielen.

Einige andere Hinweise:

  • MySQL Booleschen Ausdrücken als Zahlen in einem numerischen Kontext behandelt, mit "1" für wahr. Sie benötigen keine CASE.
  • Der ANSI-Standard für Zeichenfolgenbegrenzer ist einfache Anführungszeichen, keine Anführungszeichen.
  • Die Datumslogik ist einfacher mit Daten. Sie müssen sich keine Gedanken darüber machen, wann die letzte Transaktion an einem bestimmten Tag stattfindet.
  • Warum verwenden Sie LIMIT 5, wenn Sie Daten für sechs Tage auswählen?
Verwandte Themen