postgresql行转列、列转行
在PostgreSQL中,行转列通常使用crosstab
函数,该函数需要安装tablefunc
模块。列转行通常使用UNION ALL
或者JOIN
操作。
以下是一个简单的例子:
- 行转列(使用
crosstab
)
假设有一个sales
表:
CREATE TABLE sales (
year int,
product text,
amount numeric
);
INSERT INTO sales (year, product, amount) VALUES
(2020, 'A', 100),
(2020, 'B', 200),
(2021, 'A', 150),
(2021, 'B', 250);
要将sales
表按年份转为列,可以使用crosstab
:
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT year, product, amount
FROM sales
ORDER 1,2'
) AS final_result(year int, product_a numeric, product_b numeric);
- 列转行(使用
UNION ALL
)
如果有一个年份和两个产品的列,想将其转回行格式:
CREATE TABLE yearly_sales (
year int,
product_a numeric,
product_b numeric
);
INSERT INTO yearly_sales (year, product_a, product_b) VALUES
(2020, 100, 200),
(2021, 150, 250);
SELECT year, 'A' AS product, product_a AS amount
FROM yearly_sales
UNION ALL
SELECT year, 'B', product_b
FROM yearly_sales
ORDER BY year, product;
这里使用UNION ALL
将每个产品的列再转回行格式。
评论已关闭