PostgreSQL 将行动态转置为列

Posted

技术标签:

【中文标题】PostgreSQL 将行动态转置为列【英文标题】:PostgreSQL transpose rows to columns dynamicaly 【发布时间】:2019-03-27 10:56:43 【问题描述】:

您好,我试图让我的查询结果在每列 1 行中动态对齐,如果可能,请帮助我

例如这是我的桌子

id , names , comm    , contrib
1    samp1   randtext     9
2    samp1   randtext     2
3    samp1   randtext     3 
5    samp2   randtext     4 
6    samp2   randtext     1   

那么我试图得到的结果是

names  comm1    comm2    comm3    contrib1  contrib2  contrib3 
samp1  randtext,randtext,randtext    9      , 2       , 3
samp2  randtext,randtext,            4      , 1       ,  

感谢您的帮助。

【问题讨论】:

***.com/search?q=%5Bpostgresql%5D+pivot+crosstab 请具体说明。 【参考方案1】:

我们可以将ROW_NUMBER 与数据透视查询结合使用:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY names ORDER BY id) rn
    FROM your_table
)

SELECT
    names,
    MAX(CASE WHEN rn = 1 THEN comm END) comm1,
    MAX(CASE WHEN rn = 2 THEN comm END) comm2,
    MAX(CASE WHEN rn = 3 THEN comm END) comm3,
    MAX(CASE WHEN rn = 1 THEN contrib END) contrib1,
    MAX(CASE WHEN rn = 2 THEN contrib END) contrib2,
    MAX(CASE WHEN rn = 3 THEN contrib END) contrib3
FROM cte
GROUP BY
    names
ORDER BY
    names;

【讨论】:

谢谢蒂姆! .有没有办法让它更加动态..例如 comm 和 contrib 将有超过 3 列取决于插入项目的长度? 查看您的问题下的交叉表评论,或研究使用动态 SQL。

以上是关于PostgreSQL 将行动态转置为列的主要内容,如果未能解决你的问题,请参考以下文章

将单行转置为列

将 SQL 行数据转置为列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

大查询 - 将数组/json 对象转置为列

mysql 将行转置为列

CASE语句将行转置为列