使用罗斯文数据库进行练习,如下所示:
我试图了解如何在同时使用order和order_details表时执行交叉表。交叉表包括订单表中的employee_id和ship_country以及order_details表中的unit_price
订单表中的样本数据:
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;”。命令也没有问题。
答案 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 answer或this
答案 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上发布是一种糟糕的体验-很难全部输入,很抱歉)。更改汇总函数(最大值,总和,平均等)以更改网格中数据的累积方式