PostgreSQL 交叉表转置行到列

Posted

技术标签:

【中文标题】PostgreSQL 交叉表转置行到列【英文标题】:PostgreSQL crosstab transpose row to column 【发布时间】:2019-03-27 13:30:34 【问题描述】:

大家好,我正在尝试将行查询结果转换为每列 1 行

第一个查询是从 sku 中选择 *; 结果是:

id sku  sku_code travel_code     
1   sku1    1   1
2   sku1    2   2
3   sku1    3   3
4   sku1    4   4
5   sku1    5   5
6   sku1    6   6
7   sku1    7   7
8   sku2    8   8
9   sku2    9   9
10  sku2    10  10
11  sku2    11  11
12  sku2    12  12
13  sku2    13  13
14  sku2    14  14
15  sku3    15  15
16  sku3    16  16
17  sku3    17  17
18  sku3    18  18
19  sku3    19  19
20  sku3    20  21
21  sku3    21  21

预期输出是

SKU   SKU_CODE           TRAVEL_CODE  
sku1  1  2  3   4  5  6  7  1  2  3  4  5  6  7 
sku2  8  9  10 11 12 13  14  8  9 10 11 12 13 14
sku3  15 16 17 18 19 20  21 15 16 17 18 19 20 21 

没有标题是好的

【问题讨论】:

【参考方案1】:

您可以将groupingminmax 聚合函数一起使用

with tab(sku, sku_cod, travel_code) as
(
 select 'sku1',109,'01' union all 
 select 'sku2',209,'02' union all
 select 'sku2',309,'03' union all
 select 'sku1',409,'04'   
)
select sku, min(sku_cod) as sku_cod1, max(sku_cod) as sku_cod2, 
            min(travel_code) as travel_code1, max(travel_code) as travel_code2
  from tab
 group by sku
 order by sku;

sku     sku_cod1    sku_cod2    travel_code1    travel_code2
sku1    109         409         01              04
sku2    209         309         02              03

【讨论】:

如果 select ... 来自 select * from ... 查询的结果,我如何使用 with 选项卡 @JakeGarbo 我不明白你想说什么。 我无法静态应用“sku1”、“sku2”,因为查询具有动态 skus @JakeGarbo 你需要分享整个需求和样本输入/输出。 嗯,我不明白你的意思.. 但我需要使它成为每个值 1 列【参考方案2】:

您使用的是 Postgres,因此我建议将值存储为数组:

select sku, array_agg(sku_cod) as sku_cods
       array_agg(travel_code) as travel_codes
from t
group by sku
order by sku;

这将允许您处理两个以上的值。

【讨论】:

以上是关于PostgreSQL 交叉表转置行到列的主要内容,如果未能解决你的问题,请参考以下文章

Spark:行到列(如转置或枢轴)

MySQL如何按列转置行

仅使用最小 COUNT() 转置行和列(又名枢轴)?

用awk转置行和列

当 BigQuery 中没有任何“id”类型列时转置行和列

在 SQL Server 表中加入和分组后转置行