Q:

Group query results by month and year in postgresql with emply month sum

Based on this answer by Burak Arslan
SELECT date_trunc('month', txn_date) AS txn_month, sum(amount) as monthly_sum
    FROM yourtable
GROUP BY txn_month

Is there a way to get months that have no results to show in the query?
So let's say I have : 
id      transDate     Product Qty
1234    04/12/2019    ABCD    2     
1245    04/05/2019    ABCD    1
1231    02/07/2019    ABCD    6

I also need to the the third Month returns with a 0 value
MonthYear  totalQty
02/2019    6
03/2019    0
04/2019    3

Thanks, 
---- UPDATE ---
Here is the final query that that gets last 24 months from the current date. with year and month ready for any charts. 
Thanks to @a_horse_with_no_name 
SELECT 
    --ONLY USE THE NEXT LINE IF YOU NEED TO HAVE THE ID IN YOUR RESULT
    CASE WHEN t."ItemId" IS NULL THEN 10607 ELSE t."ItemId" END AS "ItemId",
    TO_CHAR(y."transactionDate", 'yyyy-mm-dd') AS txn_month,
    TO_CHAR(y."transactionDate", 'yyyy') AS "Year",
    TO_CHAR(y."transactionDate", 'Mon') AS "Month",
    -coalesce(SUM(t."transactionQty"),0) AS "TotalSold"
FROM generate_series(
    TO_CHAR(CURRENT_DATE - INTERVAL '24 month', 'yyyy-mm-01')::date , 
    TO_CHAR(CURRENT_DATE, 'yyyy-mm-01')::date, 
    INTERVAL '1 month') as y("transactionDate")
  LEFT JOIN "ItemTransactions" AS t 
         ON date_trunc('month', t."transactionDate") = y."transactionDate"
        AND t."ItemTransactionTypeId" = 1
        AND t."ItemId" = 10607
GROUP BY txn_month, "Year", "Month", t."ItemId"
ORDER BY txn_month ASC;

EXEMPLE OUTPUT
ItemId  txn_month   Year    Month   TotalSold
10607   2018-03-01  2018    Mar     2
10607   2018-04-01  2018    Apr     0
10607   2018-05-01  2018    May     8
10607   2018-06-01  2018    Jun     12
10607   2018-07-01  2018    Jul     6
10607   2018-08-01  2018    Aug     4
10607   2018-09-01  2018    Sep     6
10607   2018-10-01  2018    Oct     8
10607   2018-11-01  2018    Nov     4
10607   2018-12-01  2018    Dec     0
10607   2019-01-01  2019    Jan     2
10607   2019-02-01  2019    Feb     3
10607   2019-03-01  2019    Mar     4
10607   2019-04-01  2019    Apr     1
10607   2019-05-01  2019    May     4
10607   2019-06-01  2019    Jun     3
10607   2019-07-01  2019    Jul     5
10607   2019-08-01  2019    Aug     6
10607   2019-09-01  2019    Sep     6
10607   2019-10-01  2019    Oct     6
10607   2019-11-01  2019    Nov     3
10607   2019-12-01  2019    Dec     0
10607   2020-01-01  2020    Jan     4
10607   2020-02-01  2020    Feb     2
10607   2020-03-01  2020    Mar     0

A:

Left join to a list of months:
SELECT t.txn_month, 
       coalesce(sum(yt.amount),0) as monthly_sum
FROM generate_series(date '2019-02-01', date '2019-04-01', interval '1 month') as t(txn_month)
  left join yourtable yt on date_trunc('month', yt.transdate) = t.txn_month
GROUP BY t.txn_month

Online example

In your actual query you need to move the conditions from the WHERE clause to the JOIN condition. Putting them into the WHERE clause turns the outer join back into an inner join:
SELECT t."ItemId",
       y."transactionDate" AS txn_month,
       -coalesce(SUM(t."transactionQty"),0) AS "TotalSold"
FROM generate_series(date '2018-01-01', date '2020-04-01', INTERVAL '1 month') as y("transactionDate")
  LEFT JOIN "ItemTransactions" AS t 
         ON date_trunc('month', t."transactionDate") = y."transactionDate"
        AND t."ItemTransactionTypeId" = 1
        AND t."ItemId" = 10606
-- this WHERE clause isn't really needed because of the date values provided to generate_series()
WHERE AND y."transactionDate" >= NOW() - INTERVAL '2 year'
GROUP BY txn_month, t."ItemId"
ORDER BY txn_month DESC;

