postgresql转置具有不同的属性行

时间:2018-04-02 11:45:21

标签: sql postgresql

这是我第一次使用转置 所以我不知道我想要的是否可能

这是我的查询

SELECT * 
FROM crosstab( 
    'select p.name, a.attributekey, a.attributevalue
    from productz p 
    join attribute a on a.itemid=p.id
    order by p.name, a.attributekey') 
     AS final_result(name varchar, interface varchar, negativemargin varchar,parity varchar);
select p.name, a.attributekey, a.attributevalue
    from productz p 
    join attribute a on a.itemid=p.id
order by p.name, a.attributekey;

这里是链接 http://rextester.com/IQNSY51011

但是输出与我想要的不同,因为productz 1有两行而productz 2有3行

name      interface negativemargin parity
dufan     true      true           NULL
waterboom android   true           false

我想要的输出如下所示没有插入接口,Null到数据库

name      interface negativemargin parity
dufan     NULL      true           true
waterboom android   true           false

注意:请点击"运行它"打开链接后

1 个答案:

答案 0 :(得分:1)

解决您的问题:

SELECT * 
FROM crosstab( 
    'select p.name, a.attributekey, a.attributevalue
    from productz p 
    join attribute a on a.itemid=p.id
    order by p.name, a.attributekey',
    'SELECT DISTINCT attributekey FROM attribute ORDER BY 1') 
     AS final_result(name varchar, interface varchar, negativemargin varchar,parity varchar);

链接: http://rextester.com/OPNK82802

crosstab(text, text)与2个输入参数一起使用。 第二个参数可以是任何查询,每个属性返回一行,最后匹配列定义的顺序。

CROSSTAB(文本)有什么问题,即带有1个参数的交叉表?

交叉表的单参数形式的主要限制是它同样处理组中的所有值,将每个值插入第一个可用列。如果您希望值列对应于特定类别的数据,并且某些组可能没有某些类别的数据,那么这样做效果不佳。交叉表的双参数形式通过提供与输出列对应的类别的显式列表来处理这种情况。

有关crosstab的更多信息,请点击以下链接:

  

https://www.postgresql.org/docs/9.2/static/tablefunc.html