Postgres Динамический запрос кросс-таблицы c pivot - PullRequest
0 голосов
/ 22 апреля 2020

Кто-нибудь знает, как создать следующую кросс-таблицу в Postgres?

Например, у меня есть следующая таблица:

Store      Month        Sales
A          Mar-2020     100
A          Feb-2020     200
B          Mar-2020     400
B          Feb-2020     500
A          Jan-2020     400
C          Apr-2020     600

Я бы хотел, чтобы запрос возвратил следующее В кросс-таблице заголовки столбцов не должны быть жестко заданными значениями, а должны отражать значения в столбце «месяц» из первой таблицы:

Store    Jan-2020    Feb-2020    Mar-2020    Apr-2020
A        400         200         100         -
B        -           500         400         -
C        -           -           -           600

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Postgres имеет функцию crosstab, но я думаю, что использование встроенной функции фильтрации в этом случае просто:

select store,
       sum(sales) filter (where month = 'Jan-2020') as Jan_2020,
       sum(sales) filter (where month = 'Feb-2020') as Feb_2020,
       sum(sales) filter (where month = 'Mar-2020') as Mar_2020,
       sum(sales) filter (where month = 'Apr-2020') as Apr_2020
from t
group by store
order by store;

Примечание: это помещает значения NULL в столбцы с нет соответствующего значения, а не -. Если вы действительно хотите использовать дефис, вам нужно преобразовать значение в строку - и это кажется излишне сложным.

0 голосов
/ 22 апреля 2020

Попробуйте это с CASE выражением внутри SUM(), вот db-fiddle .

select
    store,
    sum(case when month = 'Jan-2020' then sales end) as "Jan-2020",
    sum(case when month = 'Feb-2020' then sales end) as "Feb-2020",
    sum(case when month = 'Mar-2020' then sales end) as "Mar-2020",
    sum(case when month = 'Apr-2020' then sales end) as "Apr-2020"
from myTable
group by
   store
order by
   store

Вывод:

+---------------------------------------------------+
|store  Jan-2020    Feb-2020    Mar-2020    Apr-2020|
+---------------------------------------------------+
| A        400         200         100         null |
| B        null        500         400         null |
| C        null        null        null        600  |
+---------------------------------------------------+

Если вы хотите заменить null значения на 0 на выходе, затем используйте coalesce()

например

coalesce(sum(case when month = 'Jan-2020' then sales end), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...