Кросс-таблица Postgresql для нескольких поворотов и нескольких столбцов - PullRequest
0 голосов
/ 06 сентября 2018

Я пытался создать перекрестную таблицу для нескольких сводок и нескольких столбцов

Как мне перейти от

create table sales(year int, branch text, month int, qty int, scrap int, yield int);
insert into sales values(2007, 'Houston', 1, 1000, 66, 11);
insert into sales values(2007, 'Houston', 3, 1500, 55, 22);
insert into sales values(2007, 'Austin',  3,  500, 44, 33);
insert into sales values(2007, 'Laredo',  2, 1500, 77, 44);
insert into sales values(2007, 'El Paso', 2, 2000, 88, 55);
insert into sales values(2008, 'Waco',    1,  900, 99, 66);

для перекрестной таблицы, как это

 year | branch  | jan_qty | jan_scr | jan_yld | feb_qty | feb_scr | feb_yld | mar_qty | mar_scr | mar_yld
------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------
 2007 | Austin  |         |         |         |         |         |         |     500 |      44 |      33     
 2007 | El Paso |         |         |         |    2000 |      88 |      55 |         |         |     
 2007 | Houston |    1000 |      66 |      11 |         |         |         |    1500 |      55 |      22
 2007 | Laredo  |         |         |         |    1500 |      77 |      44 |         |         | 
 2008 | Waco    |     900 |      99 |      66 |         |         |         |         |         | 

где год и ветвь являются опорными и каждый месяц содержит 3 значения?

1 Ответ

0 голосов
/ 06 сентября 2018

1. Самый простой маршрут

Возможно следующее. Это не DRY , но оно выполняет свою работу, оно читаемо, работает для любого SQL-варианта и может быть легко сгенерировано кодом приложения.

SELECT
  grain.year,
  grain.branch,
  (SELECT qty FROM sales WHERE sales.year = grain.year AND sales.branch = grain.branch AND sales.month = 1) AS jan_qty,
  (SELECT scr FROM sales WHERE sales.year = grain.year AND sales.branch = grain.branch AND sales.month = 1) AS jan_scr,
  (SELECT yld FROM sales WHERE sales.year = grain.year AND sales.branch = grain.branch AND sales.month = 1) AS jan_yld,
  ... same for feb ...,
  ... same for mar ...
FROM (SELECT DISTINCT year, branch FROM sales) grain

Код приложения просто нуждается в именах столбцов jan_qty, jan_scr ... для генерации этого SQL с помощью простого цикла.

Я бы обязательно EXPLAIN ANALYZE запрос выше, чтобы убедиться, что PostgreSQL эффективно выполняет этот запрос.

2. Прекрасный маршрут

Это сводная таблица, и PostgreSQL предоставляет нам функцию CROSSTAB для этого типа запроса. Этот пост прекрасно объясняет, как это сделать, в том числе, как справляться с пропущенными значениями (т. Е. Пустыми ячейками в таблице результатов), что имеет место в приведенном вами примере

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