CROSSTAB и DATEPART в postgres? Это работает? - PullRequest
1 голос
/ 03 мая 2020

У меня есть столбец с датами, отформатированными, например, 2015-02-19, и я пытаюсь выделить год и выделить год в виде отдельных столбцов, чтобы показать общий объем продаж за год. Мой исходный запрос работает нормально, но при попытке выполнить полный запрос я получаю синтаксическую ошибку для year_sales

SELECT *
FROM CROSSTAB(
    'SELECT sales_agent, date_part('year', sales_date) AS yearly_sales, SUM(daily_sales)
     FROM agent_sales_table
     GROUP BY sales_agent, yearly_sales
     ORDER BY sales_agent, yearly_sales') AS source (sales_agent text, 2015 numeric, 2016 numeric);
ERROR:  syntax error at or near "year"
LINE 3:  'SELECT sales_agent, date_part('year', sales_date) AS yearly_sales, SUM(daily_s...
                                         ^

Итак, работает ли datepart с кросс-таблицей?

1 Ответ

2 голосов
/ 03 мая 2020

Я бы просто использовал условную агрегацию здесь. Я считаю, что синтаксис легче понять; Кроме того, это может быть более эффективным решением, особенно если вы используете правильный синтаксис для фильтрации дат, а именно:

select
    sales_agent,
    sum(daily_sales) filter(where sales_date >= date '2015-01-01' and sales_date < date '2016-01-01') sales_2015
    sum(daily_sales) filter(where sales_date >= date '2016-01-01' and sales_date < date '2017-01-01') sales_2016
from mytable
group by sales_agent

Этот запрос может использовать индекс на sales_agent, sales_date). * 1005. *

Вы можете легко расширить предложение select на несколько лет. Также может быть полезно добавить предложение where, чтобы ограничить строки для агрегирования ранее. На самом деле, если вы просто хотите 2015 и 2016 годы, запрос можно записать так:

select
    sales_agent,
    sum(daily_sales) filter(where sales_date <  date '2016-01-01') sales_2015
    sum(daily_sales) filter(where sales_date >= date '2016-01-01') sales_2016
from mytable
where sales_date >= date '2015-01-01' and sales_date < date '2017-01-01'
group by sales_agent
...