/ / Jak grupować według miesiąca i zwracać zero, jeśli nie ma wartości dla określonego miesiąca? - mysql, sql, node.js

Jak grupować według miesiąca i zwracać zero, jeśli nie ma wartości dla określonego miesiąca? - mysql, sql, node.js

To jest moja tabela dochodów mysql.

+----+------------------+---------------------------+------------+---------+
| 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 |
+----+------------------+---------------------------+------------+---------+

Pole "data" to standardowa data sql. I wykonałem to zapytanie, aby zsumować dochody według miesiąca i zwrócić zero, jeśli nie ma dochodu z określonego miesiąca. Chcę zer, jeśli nie ma dochodu z określonego miesiąca, ponieważ chcę wyświetlić te dane na wykresie.

To jest zapytanie.

SELECT MONTHNAME(`date`) AS mName, MONTH(`date`) AS mOrder, ifnull(sum(amount),0) AS total_num FROM income GROUP BY mOrder ORDER BY mOrder DESC

Ale otrzymuję tylko dane wyjściowe w następujący sposób. Bez zer, jeśli nie ma wartości w innych miesiącach. To jest wynik.

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

I chcę, aby inne miesiące w powyższej tabeli i całkowity_num jako zero. Jak mogę to zrobić? Jest tam również takie samo pytanie, ale nie ma żadnej działającej odpowiedzi. Grupuj według miesiąca i zwracaj 0, jeśli nie znaleziono danych

Pomóż mi rozwiązać ten problem. Językiem używanym w tej aplikacji jest Node.JS :)

Odpowiedzi:

1 dla odpowiedzi № 1

Może to nie jest najlepszy sposób, aby to zrobić, ale rozwiąże twój problem.

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

2 dla odpowiedzi nr 2

Miej stół ze wszystkich miesięcy, a potem left join do twojego stołu:

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

Jeśli nie chcesz tworzyć months następnie możesz:

(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 dla odpowiedzi № 3

Powinieneś utworzyć tabelę KALENDARZA z dokładnością, której potrzebujesz, w tym przypadku miesięcy.

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

I dołącz do niego