Я использовал приведенный ниже запрос, чтобы получить количество записей по месяцам. Работает хорошо для конкретного года.
Тем не менее, это немного неудобно, если я хочу сравнить подсчет с января 2018 года по январь 2019 года. Особенно, если я хочу построить график.
Как я могу настроить это так, чтобы я мог получить результат типа 18 января, 18 февраля, .... 19 января, указав промежуток лет.
Это Постгрес 9.6.
Спасибо!
SELECT
count(case when to_char(t.order_date, 'MM') = '01' then 1 END) as Jan,
count(case when to_char(t.order_date, 'MM') = '02' then 1 END) as Feb,
count(case when to_char(t.order_date, 'MM') = '03' then 1 END) as Mar,
count(case when to_char(t.order_date, 'MM') = '04' then 1 END) as Apr,
count(case when to_char(t.order_date, 'MM') = '05' then 1 END) as May,
count(case when to_char(t.order_date, 'MM') = '06' then 1 END) as June,
count(case when to_char(t.order_date, 'MM') = '07' then 1 END) as Jul,
count(case when to_char(t.order_date, 'MM') = '08' then 1 END) as Aug,
count(case when to_char(t.order_date, 'MM') = '09' then 1 END) as Sep,
count(case when to_char(t.order_date, 'MM') = '10' then 1 END) as Oct,
count(case when to_char(t.order_date, 'MM') = '11' then 1 END) as Nov,
count(case when to_char(t.order_date, 'MM') = '12' then 1 END) as Dec
FROM transactions as t
WHERE to_char(t.order_date, 'YYYY') = '2019'
Но тогда мне нужно было бы иметь запись для каждого месяца каждого года, который я хочу показать. Я бы предпочел просто указать диапазон лет или список лет и запустить его.
Нет. SQL-запрос должен возвращать набор столбцов фиксированный. Если вам нужен отдельный столбец в результатах для каждого года/месяца, это означает динамическое количество столбцов (в зависимости от диапазона лет)...
Почему бы не сделать WHERE to_char(t.order_date, 'YYYY') BETWEEN '2017' AND '2019'?


Вы можете создавать «сегменты» ваших данных по отметке времени, комбинируя:
SELECT
date_trunc('month', t.order_date) AS order_month,
count(t.order_id) AS count
FROM transaction AS t
GROUP BY order_month
ORDER BY order_month
Тогда вам решать, какими годами ограничить результат:
SELECT
date_trunc('month', t.order_date) AS order_month,
count(t.order_id) AS count
FROM transaction AS t
WHERE
date_part('year', t.order_date) = 2019
GROUP BY order_month
ORDER BY order_month
Вы хотите получить результаты в разных строках?
SELECT to_char(t.order_date, 'YYYY') = '2019',
count(*) filter (to_char(t.order_date, 'MM') = '01') as Jan,
count(*) filter (to_char(t.order_date, 'MM') = '02') as Feb,
. . .
count(*) filter (to_char(t.order_date, 'MM') = '12') as Dec
FROM transactions as t
GROUP BY to_char(t.order_date, 'YYYY') = '2019'
Please check below query, is this relevant?
Blockquote
ВЫБРАТЬ
to_char(дата_заказа, 'ГГГГ'),
count (случай, когда to_char (t.order_date, 'MM') = '01', затем 1 END) как январь,
count (случай, когда to_char (t.order_date, 'MM') = '02', затем 1 END) как февраль,
count (случай, когда to_char (t.order_date, 'MM') = '03', затем 1 END) как март,
count (случай, когда to_char (t.order_date, 'MM') = '04', затем 1 END) как апр,
count (случай, когда to_char (t.order_date, 'MM') = '05', затем 1 END) как май,
count (случай, когда to_char (t.order_date, 'MM') = '06', затем 1 END) как июнь,
count (случай, когда to_char (t.order_date, 'MM') = '07', затем 1 END) как июль,
count (случай, когда to_char (t.order_date, 'MM') = '08', затем 1 END) как август,
count (случай, когда to_char (t.order_date, 'MM') = '09', затем 1 END) как Sep,
count (случай, когда to_char (t.order_date, 'MM') = '10', затем 1 END) как октябрь,
count (случай, когда to_char (t.order_date, 'MM') = '11', затем 1 END) как ноябрь,
count (случай, когда to_char (t.order_date, 'MM') = '12', затем 1 END) как Dec
ОТ транзакций как t, где to_char(order_date, 'YYYY') в ('2018','2019')
группировать по to_char(order_date, 'ГГГГ');
Blockquote
Как насчет просто:
count(case when to_char(t.order_date, 'MM-YY') = '01-18' then 1 END) as Jan18?