2016-07-25 11 views
0

Dies ist meine MySQL-Tabelle.Wie gruppiere ich nach Monat und gebe Null zurück, wenn kein Wert für einen bestimmten Monat ist?

+----+------------------+---------------------------+------------+---------+ 
| id | title   | description    | date  | amount | 
+----+------------------+---------------------------+------------+---------+ 
| 1 | Vehicle sales up | From new sale up   | 2016-09-09 | 9999.99 | 
| 2 | Jem 2 Sales  | From rathnapura store  | 2016-05-15 | 9545.25 | 
| 3 | Jem 2 Sales 2 | From rathnapura store  | 2016-05-15 | 9545.25 | 
| 4 | Jem 2 Sales 2 | From rathnapura store 234 | 2016-05-15 | 9545.25 | 
+----+------------------+---------------------------+------------+---------+ 

Das Feld 'Datum' ist Standard-SQL-Datum. Und ich habe diese Abfrage ausgeführt, um die Summe der Einkommen nach Monat zu nehmen und Null zurückzugeben, wenn kein Einkommen von einem bestimmten Monat. Ich möchte Nullen wenn kein Einkommen von einem bestimmten Monat, weil ich diese Daten in einem Diagramm anzeigen möchte.

Dies ist die Abfrage.

Aber ich bekomme nur eine Ausgabe wie folgt. Keine Nullen wenn keine Werte in anderen Monaten. Dies ist die Ausgabe.

+-----------+--------+-----------+ 
| mName  | mOrder | total_num | 
+-----------+--------+-----------+ 
| September |  9 | 9999.99 | 
| May  |  5 | 28635.75 | 
+-----------+--------+-----------+ 

Und ich möchte andere Monate in obiger Tabelle und total_num als Null. Wie kann ich das machen? Dort gibt es dieselbe Frage. Aber keine funktionierende Antwort.

Bitte helfen Sie mir, dieses Problem zu lösen. Die Sprache, die ich für diese Anwendung verwenden, ist Node.JS :)

+0

Aber Sie haben nur 2 Monate in Ihrem Beispiel, so Ergebnis ist ziemlich vorhersehbar. – user1016265

+0

Ich denke, dass Sie eine Art Calandar-Tabelle benötigen, und treten Sie ihr bei, dann gruppieren Sie nach Monat – guiguiblitz

+0

@ user1016265 Ja, ich muss Monate. Aber das ist egal, denke ich. Wenn der Code korrekt ist, sollten andere Monate mit Zoro angezeigt werden. Nein ? Deshalb möchte ich. Stellen Sie sich vor, dies ist ein Buchhaltungssystem und zu Beginn des Jahres haben wir Einkommen nur für Januar. Also müssen andere 11 Monate mit 0 Einkommen kommen. Nein ? –

Antwort

1

Vielleicht ist dies nicht der beste Weg, es zu tun, aber es wird Ihr Problem lösen. Als schnelle Version:

SELECT 'January' AS mName, 1 AS mOrder, COALESCE(SUM(amount),0) AS total_num 
FROM income i 
WHERE month(i.date) = 1 

UNION 

SELECT 'February' AS mName, 2 AS mOrder, COALESCE(SUM(amount),0) AS total_num 
FROM income i 
WHERE month(i.date) = 2 

UNION 

...and go on 
+0

Ich denke, dass die Lösung möglich ist, obwohl es ein bisschen hässlich ist :-) – user1016265

+0

Das funktioniert nicht, weil Sie immer noch aus dem Einkommen auswählen - und vielleicht nicht alle Monate sind da .. –

+0

Es spielt keine Rolle. Stellen Sie sich vor, Sie haben kein Datum im Januar. Die erste Auswahl gibt 1 Zeile zurück: (Januar, 1, 0). Wenn Sie "SUMME" verwenden, wenn Sie keine Datensätze haben, wird 1 Zeile mit Nullwert anstelle von Zeilen zurückgegeben. Bitte versuchen Sie es vor Sprüchen, es funktioniert nicht. Es ist keine elegante Art, es zu tun, aber es funktioniert wie erwartet. – Rumpelstinsk

2

Haben Sie eine Tabelle aller Monate und dann left join auf den Tisch:

SELECT MONTHNAME(m.month) AS mName, 
    MONTH(m.month) AS mOrder, 
    ifnull(sum(amount),0) AS total_num 
from months m 
left join income i 
on m.month = i.date 

GROUP BY mOrder 
ORDER BY mOrder DESC 

Wenn Sie dann eine months Tabelle nicht erstellen möchten Sie können:

(select STR_TO_DATE('01/01/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/02/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/03/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/04/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/05/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/06/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/07/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/08/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/09/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/10/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/11/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/12/2016', '%d/%m/%Y') as month) 
+0

Sammlung bedeutet ???? Eine MySQL-Tabelle mit dem Namen 'Monate' ???? Und was ist "m.date", das du erwähnt hast? –

+0

Wie verbinden Sie diese Monate, die Sie später mit der obigen Abfrage hinzugefügt haben ???? Ein wenig Hilfe bitte. –

+0

Ich kann auch eine monatliche Tabelle erstellen. Kein Problem.Weil ich nicht verstehen kann, wie ich diese Select-Abfragen verwenden kann, die Sie später mit Ihrer ersten SQL-Abfrage hinzugefügt haben. Kannst du mir sagen, welche Felder ich hinzufügen soll, wenn ich eine Monatstabelle mache? Oder bitte erkläre mir, wie man diese beiden Abfragen zusammen verwendet :) –

0

Sie sollten eine KALENDER-Tabelle mit der Genauigkeit, die Sie benötigen, in diesem Fall Monate erstellen.

+-----------+ 
| Month  | 
+-----------+ 
| January | 
| February |  
....... 

und kommen auf sie

Verwandte Themen