pg 里面行转列
时间: 2023-07-25 08:11:36 浏览: 43
在 PostgreSQL 中,可以使用 crosstab 函数将行转换为列。crosstab 函数是 partman 扩展的一部分,需要安装该扩展才能使用。该函数需要三个参数:第一个参数是 SQL 查询语句,用于获取需要转换的数据;第二个参数是 crosstab 的行定义,用于指定需要转换的行;第三个参数是 crosstab 的列定义,用于指定需要转换的列。示例如下:
```
SELECT *
FROM crosstab(
'SELECT year, quarter, total_sales
FROM sales
ORDER BY 1,2',
'SELECT DISTINCT quarter FROM sales ORDER BY 1',
'SELECT DISTINCT year FROM sales ORDER BY 1'
) AS ct(year integer, q1 integer, q2 integer, q3 integer, q4 integer);
```
在上面的示例中,我们使用了一个 sales 表,并将其按照年份和季度进行排序。然后,我们使用 crosstab 函数将行转换为列,将季度作为行定义,将年份作为列定义,并将销售额作为需要转换的数据。函数返回一个结果集,其中包含了每个年份与季度对应的销售额。
相关问题
pg 里面列转行
在 PostgreSQL 中,可以使用 UNNEST 函数将列转换为行。UNNEST 函数可以将数组或者包含多个元素的行转换为单个元素的多行。例如,如果有一个包含多个元素的行,可以使用 UNNEST 函数将其转换为多行,每行包含一个元素。示例如下:
```
SELECT unnest(array[1,2,3,4,5]) AS num;
```
这将返回以下结果:
```
num
-----
1
2
3
4
5
(5 rows)
```
在上面的示例中,我们使用了一个包含多个元素的数组,并将其传递给 UNNEST 函数。函数返回了一个包含每个元素的单独行的结果集。
pg 行转列
在 PostgreSQL 中,可以使用 `crosstab` 函数将行转换为列。但是,要使用 `crosstab` 函数,首先需要安装 `tablefunc` 扩展。
以下是一个示例查询,将 `mytable` 表中的 `category` 值作为列,并将 `value` 值作为行:
```sql
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT id, category, value
FROM mytable
ORDER BY 1',
'SELECT DISTINCT category FROM mytable ORDER BY 1'
) AS ct(id int, category1 int, category2 int, category3 int);
```
这将返回一个表格,其中每个唯一的 `category` 值都是一个列。如果 `mytable` 中有 3 个不同的 `category` 值,那么结果将具有 4 列(`id` 和 3 个 `category` 值)。每行的值将根据 `id` 和 `category` 值从 `value` 列中提取。
请注意,`crosstab` 函数的第二个参数是用于确定唯一 `category` 值的子查询,因此必须在查询中指定这些值。