从子查询返回多个列作为列

时间:2019-12-03 08:30:23

标签: sql postgresql

这是我的数据。

StateService

给出此数据。我该如何显示呢?

Bubble03StateService

我尝试过“左连接横向”,但可悲。它要做的是返回两行。

之所以要这样做,是因为Im正在开发一个模块,用于存储具有多个计量单位(最多3个)的产品。所以我不想创建Unit,Pack和Case的3列,因此我创建了UOM_conversion表的原因。

1 个答案:

答案 0 :(得分:1)

我认为这是一个全球性的误解,但是在解决您的问题之后,我会为您提供。我建议你看看。

因此,首先:这里需要的是crosstab()函数。

CREATE EXTENSION tablefunc;

对于以下脚本:

create table uom
(
    uom_id int primary key
    , description varchar (250)
);

create table products 
(
    prod_id int primary key
    , prod_desc varchar(250)
    , base_unit_id int references uom (uom_id)
);

create table uom_conversion 
(
    prod_id int references products (prod_id)
    , from_unit_id int references uom (uom_id)
    , multiplier int
    , to_unit_id int references uom (uom_id)
);

insert into uom values (1, 'Piece'), (2, 'Box'), (3, 'Case');
insert into products values (1, 'Custom Product', 1);
insert into uom_conversion values (1,1,100,2), (1,1,400,3);

请求是:

select 
    p.prod_desc as "Product"
    , u.description as "Base Unit"
    , u2.description as "Pack Unit"
    , final_res."1" as "Multiplier"
    , u3.description as "Case Unit"
    , final_res."2" as "Multiplier"
from crosstab(
'select 
    p.prod_id
    , base_unit_id
    , multiplier
from products p
    inner join uom_conversion uc
        on uc.prod_id = p.prod_id')
        as final_res (prod_id int, "1" int, "2" int)
    inner join crosstab('select 
    uc.prod_id
    , u.description
    , uc.to_unit_id
from uom_conversion uc
    inner join uom u
        on u.uom_id = uc.to_unit_id') 
        as final_res_2 (prod_id int, "Box" int, "Case" int)
    on final_res.prod_id = final_res_2.prod_id
    inner join products p
    on p.prod_id = final_res.prod_id
    inner join uom u
    on p.base_unit_id = u.uom_id
    inner join uom u2
    on u2.uom_id = final_res_2."Box"
    inner join uom u3
    on u3.uom_id = final_res_2."Case";

这正在解决您的问题。但是:您如何知道什么是pack_unit和什么是case_unit?我认为,从这个问题来看,还会有更多的事情。