Рассчитать дисперсию продаж между годами, агрегированными по месяцам в postgresql - PullRequest
0 голосов
/ 14 января 2019

У меня есть таблица продаж с двумя столбцами в PostgreSQL: продажи и дата. Например, со следующими данными:

Date         Sales
2017-02-05   600
2017-03-01   800
2018-01-10   300
2018-02-02   500
2018-02-03   300
2018-03-01   800

И мне нужно рассчитать дисперсию продаж между годами, агрегированную по месяцам.

Результат должен быть таким:

Month  sales_2017   sales_2018   variance
Jan    null         300          300
Feb    600          800          200
Mar    800          800          0

Каким должен быть запрос, чтобы получить приведенный выше результат?

1 Ответ

0 голосов
/ 14 января 2019

демо: дб <> скрипка

SELECT
    to_char(to_date(date_part::text, 'MM'), 'Mon') as month,                           -- 3
    sales_2017,
    sales_2018,
    COALESCE(sales_2018, 0) - COALESCE(sales_2017, 0) as variance                      -- 4
FROM (
    SELECT
        date_part('month', sales_date),                                                -- 1
        SUM(sales) FILTER (WHERE date_part('year', sales_date) = 2017) as sales_2017,  -- 2
        SUM(sales) FILTER (WHERE date_part('year', sales_date) = 2018) as sales_2018
    FROM
        sales
    GROUP BY 1                                                                         -- 1
)s
ORDER BY date_part
  1. date_part дает номер месяца даты. Это позволяет группировать по месяцам без даты года
  2. Это простая сводная функция: SUM значения с определенным фильтром (в данном случае это год). Это позволяет агрегировать только значения за отдельные годы
  3. Вычисление названия месяца по номеру месяца (воссоздайте тип date с помощью to_date, а затем отформатируйте его с помощью to_char). Форматер 'Mon' дает трехбуквенное сокращение.
  4. Расчет variance из предыдущих вычисленных столбцов. COALESCE преобразует значения NULL в число 0

Функции даты Postgres

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...