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 将行动态转置为列的主要内容,如果未能解决你的问题,请参考以下文章