/ / Как да групирате по месеци и да върнете нула, ако няма стойност за определен месец? - mysql, sql, node.js

Как да групирате по месеци и да върнете нула, ако няма стойност за определен месец? - mysql, sql, node.js

Това е таблицата ми за приходи в 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 |
+----+------------------+---------------------------+------------+---------+

Полето "date" е стандартна дата за SQL. И изпълних тази заявка, за да отнеме сумата на доходите по месеци и да върна нула, ако няма приходи от определен месец. Искам нули, ако няма приходи от определен месец, защото искам да покажа тези данни в диаграма.

Това е заявката.

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

Но получавам само изход, както следва. Няма нули, ако няма стойности през останалите месеци. Това е изходът.

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

И искам други месеци в таблицата по-горе и total_num като нула. Как мога да направя това? Има и същия въпрос, но няма и работен отговор. Групирайте по месеци и връщайте 0, ако данните не са намерени

Моля, помогнете ми да разреша този проблем. Езикът, който използвам за това приложение, е Node.JS :)

Отговори:

1 за отговор № 1

Може би това не е най-добрият начин да го направите, но това ще реши проблема ви. Като бърз съвет:

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 за отговор № 2

Имате таблица на всички месеци и след това left join към вашата маса:

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

Ако не искате да създадете months След това можете да:

(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 за отговор № 3

Трябва да създадете таблица КАЛЕНДАР с точността, от която се нуждаете, в този случай месеци.

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

И се присъединете към него