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;
我有一个像下面这样的 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;