两个表的PostgreSQL交叉表

时间:2018-11-17 20:33:52

标签: sql postgresql join crosstab

使用罗斯文数据库进行练习,如下所示:

northwind database schema

我试图了解如何在同时使用order和order_details表时执行交叉表。交叉表包括订单表中的employee_id和ship_country以及order_details表中的unit_price

订单表中的样本数据:

sample data orders table

order_details表中的数据示例:

sample data order_details table

我认为以下方法可以工作,但无法运行:

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 :(得分:0)

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);

function参数需要整个查询,在这种情况下,使用公用表表达式根本没有优势。只需将cte的sql移到function参数中即可。

有关交叉表的更多信息,我建议使用this answerthis

答案 1 :(得分:0)

作为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上发布是一种糟糕的体验-很难全部输入,很抱歉)。更改汇总函数(最大值,总和,平均等)以更改网格中数据的累积方式