Перекрестная таблица Postgresql на двух столах - PullRequest
0 голосов
/ 17 ноября 2018

Практика с базой данных северного ветра, показанной ниже:

схема базы данных Northwind

Я пытаюсь понять, как выполнить кросс-таблицу при использовании таблиц orders и order_details. Кросс-таблица включает employee_id и ship_country из таблицы заказов и unit_price из таблицы order_details

Пример данных из таблицы заказов:

таблица заказов данных образца

Пример данных из таблицы order_details:

пример данных таблицы order_details

Я думал, что сработает следующее, но я не смог его запустить:

with my_table as (
select o.employee_id, o.ship_country, od.unit_price
    from orders o
    join order_details od on o.order_id = od.order_id)

    select *
    from crosstab('select employee_id, ship_country, unit_price from my_table')
    as final_result(EmployeeID text, Austria numeric, Finland numeric, Italy numeric, France numeric, 
                    Germany numeric, Brazil numeric, Belgium numeric, Switzerland numeric);

Любые мысли и как заставить это работать высоко ценится. Кажется, проблема в том, что он не распознает отношение к my_table. Я запустил 'создать расширение tablefunc;' Команда тоже без проблем.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

В дополнение к ответу UBA, если вы хотите использовать свой cte, сделайте кросс-таблицу более стандартным способом / используя обычный sql:

with my_table as (
select o.employee_id, o.ship_country, od.unit_price
from orders o
join order_details od on o.order_id = od.order_id)

select employee_id,
  Sum(case when ship_country = 'Germany' then unit_price end) as Germany,
  Sum(case when ship_country = 'Brazil' then unit_price end) as Brazil,
  ...
  FROM my_table
  GROUP BY
    employee_id;

Повторите случай суммы, когда для каждой страны (отправка измобильные / мобильные SO это ужасный опыт - было бы очень тяжело работать, чтобы набрать их все, извините).Измените функцию агрегирования (max, sum, avg и т. Д.), Чтобы изменить способ накопления данных в сетке

0 голосов
/ 18 ноября 2018

Функция кросс-таблицы Postgres ожидает строку запроса как параметр и использует результат этого в «другом контексте» для запроса, вызвавшего эту функцию. Из-за этого различия контекста my_table cte просто недоступен для внутренних функций функции.

select *
from crosstab('select o.employee_id, o.ship_country, od.unit_price from orders o
               join order_details od on o.order_id = od.order_id')
as final_result(EmployeeID text, Austria numeric, Finland numeric, Italy numeric, France numeric, 
                Germany numeric, Brazil numeric, Belgium numeric, Switzerland numeric);

Параметр функции ожидает весь запрос, и в этом случае просто нет никакого преимущества в использовании общего табличного выражения. Просто переместите sql cte в параметр функции.

Более подробно о кросс-таблице я предлагаю этот ответ или этот

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