Перепишите один из своих прошлых запросов, используя ключевое слово WITH.

Составьте сводную таблицу. Посчитайте заказы, оформленные за каждый месяц в течение нескольких лет: с 2011 по 2013 год. Итоговая таблица должна включать четыре поля: invoice_month, year_2011, year_2012, year_2013. Поле invoice_month должно хранить месяц в виде числа от 1 до 12.

Если в какой-либо месяц заказы не оформляли, номер такого месяца всё равно должен попасть в таблицу.

WITH
t_1 AS (SELECT DISTINCT EXTRACT(MONTH FROM CAST(invoice_date AS date)) AS month,
             COUNT(invoice_id)
      FROM invoice
      WHERE EXTRACT(YEAR FROM CAST(invoice_date AS date)) = 2011
      GROUP BY EXTRACT(MONTH FROM CAST(invoice_date AS date))
      ORDER BY month),
t_2 AS (SELECT DISTINCT EXTRACT(MONTH FROM CAST(invoice_date AS date)) AS month,
                 COUNT(invoice_id)
        FROM invoice
        WHERE EXTRACT(YEAR FROM CAST(invoice_date AS date)) = 2012
        GROUP BY EXTRACT(MONTH FROM CAST(invoice_date AS date))
        ORDER BY month),
t_3 AS (SELECT DISTINCT EXTRACT(MONTH FROM CAST(invoice_date AS date)) AS month,
                 COUNT(invoice_id)
        FROM invoice
        WHERE EXTRACT(YEAR FROM CAST(invoice_date AS date)) = 2013
        GROUP BY EXTRACT(MONTH FROM CAST(invoice_date AS date))
        ORDER BY month)                 

SELECT t_1.month AS invoice_month,
       t_1.count AS year_2011,
       t_2.count AS year_2012,
       t_3.count AS year_2013
FROM t_1
FULL OUTER JOIN t_2 ON t_1.month = t_2.month
FULL OUTER JOIN t_3 ON t_1.month = t_3.month

Результат

invoice_month year_2011 year_2012 year_2013
1 7 7 7
2 7 7 5
3 7 7 7
4 7 7 5
5 7 7 7
6 7 7 7
7 7 7 7
8 7 7 7
9 7 6 7
10 7 7 7
11 6 7 7
12 7 7 7

Запрос стал короче. Всё благодаря общим табличным выражениям!