PostgreSQL:当需要超过三列时将行转换为列

PostgreSQL: Transforming rows into columns when more than three columns are needed

我有一个像下面这样的 table:

+---------+-------+-------+-------------+--+
| Section | Group | Level | Fulfillment |  |
+---------+-------+-------+-------------+--+
| A       | Y     |     1 | 82.2        |  |
| A       | Y     |     2 | 23.2        |  |
| A       | M     |     1 | 81.1        |  |
| A       | M     |     2 | 28.2        |  |
| B       | Y     |     1 | 89.1        |  |
| B       | Y     |     2 | 58.2        |  |
| B       | M     |     1 | 32.5        |  |
| B       | M     |     2 | 21.4        |  |
+---------+-------+-------+-------------+--+

这将是我想要的输出:

+---------+-------+--------------------+--------------------+
| Section | Group | Level1_Fulfillment | Level2_Fulfillment |
+---------+-------+--------------------+--------------------+
| A       | Y     | 82.2               | 23.2               |
| A       | M     | 81.1               | 28.2               |
| B       | Y     | 89.1               | 58.2               |
| B       | M     | 32.5               | 21.4               |
+---------+-------+--------------------+--------------------+

因此,对于每个部分和组,我想获得他们在第 1 级和第 2 级的完成百分比。为此,我尝试了 crosstab(),但使用此函数 return给我一个错误(“提供的 SQL 必须 return 3 列:rowid、类别和值。”)因为我使用了超过三列(我需要维护部分和组作为标识符对于每一行)。在这种情况下可以使用交叉表吗?

此致。

我发现 crosstab() 使用起来不必要的复杂并且更喜欢条件聚合:

select section, 
       "group", 
       max(fulfillment) filter (where level = 1) as level_1,
       max(fulfillment) filter (where level = 2) as level_2
from the_table
group by section, "group"
order by section;

Online example