SQL-запрос для подсчета по месяцам за несколько лет

Я использовал приведенный ниже запрос, чтобы получить количество записей по месяцам. Работает хорошо для конкретного года.

Тем не менее, это немного неудобно, если я хочу сравнить подсчет с января 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'

Как насчет просто: count(case when to_char(t.order_date, 'MM-YY') = '01-18' then 1 END) as Jan18 ?

GMB 08.03.2019 00:59

Но тогда мне нужно было бы иметь запись для каждого месяца каждого года, который я хочу показать. Я бы предпочел просто указать диапазон лет или список лет и запустить его.

G. Ball 08.03.2019 01:22

Нет. SQL-запрос должен возвращать набор столбцов фиксированный. Если вам нужен отдельный столбец в результатах для каждого года/месяца, это означает динамическое количество столбцов (в зависимости от диапазона лет)...

GMB 08.03.2019 01:25

Почему бы не сделать WHERE to_char(t.order_date, 'YYYY') BETWEEN '2017' AND '2019'?

EternalHour 08.03.2019 01:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
159
3

Ответы 3

Вы можете создавать «сегменты» ваших данных по отметке времени, комбинируя:

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

Другие вопросы по теме