@Atroshchenko-Dima
Python, postgres

Как транспонировать строки в столбцы?

У меня есть 3 таблицы такого вида
spoiler
CREATE TABLE dep
(
    id   integer NOT NULL,
    city text    NOT NULL,
    name text    NOT NULL,
    CONSTRAINT dep_pk PRIMARY KEY (id)
);

-- продукты

CREATE TABLE prod
(
    id    integer NOT NULL,
    price integer NOT NULL,
    name  text    NOT NULL,
    CONSTRAINT prod_pk PRIMARY KEY (id)
);

-- продажи

CREATE TABLE sales
(
    time    timestamp    NOT NULL,
    dep_id  integer        NOT NULL,
    prod_id integer        NOT NULL,
    cost    numeric(10, 2) NOT NULL,
    CONSTRAINT sales_fk1 FOREIGN KEY (dep_id) REFERENCES dep (id),
    CONSTRAINT sales_fk2 FOREIGN KEY (prod_id) REFERENCES prod (id)
);

commit;


Я написал запрос выводящий информацию в таком виде year, month, sum(cost)
spoiler
select EXTRACT(YEAR FROM time) AS YEAR, EXTRACT(month FROM time) AS month,SUM(cost) as сумма_продаж 
FROM	 
		dep
		INNER JOIN prod ON prod.id = dep.id
		INNER JOIN sales ON prod.id = sales.prod_id
WHERE time >= '2018-01-01 00:00:00'
AND city = 'town1'
GROUP BY year, month


Мне нужно перевести это в такой вид
--год \ месяц 1 2 3 4 5 6 7 8 9 10 11 12
----------------------------------------
--2018 x x x x x x x x x x x x
--2019 x x x x x x x x x x x x
--2020 x x x x x x x x x x x x

х - это сумма, которая сейчас у меня выводится в 3 столбце
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
проще на клиенте форматировать. Но поскольку число столбов в этой задаче можно считать константой, то можно и захардкодить
select EXTRACT(YEAR FROM time) AS year,
sum(cost) filter(where EXTRACT('month' FROM time) = 1) as jan,
sum(cost) filter(where EXTRACT('month' FROM time) = 2) as feb,
...
sum(cost) filter(where EXTRACT('month' FROM time) = 12) as dec
from tablename
where ...
group by 1
order by 1
Ответ написан
Комментировать
@alexalexes
Никак. Эта форма вывода сведений. Она должна рисоваться либо у конечного пользователя в графическом интерфейсе, либо скриптом на стороне сервера, клиентом СУБД которого он является (PHP, NodeJS), либо, на худой конец, хранимой процедурой или функцией, которая на выходе выдает текст в html.
Напрягать SQL, чтобы выводил произвольное кол-во столбцов - это не его задача.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы