PostGrepSql行转列

建表语句:

CREATE TABLE public.order_t (
	order_name varchar(255) NULL,
	order_id varchar(255) NULL,
	oder_time varchar(255) NULL,
	amount int4 NULL,
	province_id int4 NULL,
	test_date varchar NULL
);

测试数据:

INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('奇瑞控股-系统', 'DHDB190601022', '2019/6/1', 484, 340000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('绿城服务财务共享项目', 'DHDB210101005', '2020/12/1', 330, 330000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('浙江交投咨询项目', 'DHDB191001058', '2019/10/1', 222, 330000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('绿城服务收入结算平台系统项目', 'DHDB210601102', '2021/6/1', 321, 330000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('浙江交投工作量评估', 'DHDB210401140', '2021/4/1', 85, 330000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('绿城服务共享-咨询', 'DHDB210401032', '2021/4/1', 273, 330000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('绿城服务财务共享项目', 'DHDB210101005', '2021/1/1', 37, 330000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('中汽中心电子影像项目', 'DHBB200301032', '2020/3/1', 37, 120000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('一汽丰田系统项目', 'DHBB210101037', '2021/1/1', 447, 120000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('奇瑞控股-咨询', 'DHDB180601009', '2018/8/1', 370, 340000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('奇瑞控股-系统', 'DHDB190601022', '2018/10/1', 308, 340000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('奇瑞控股-系统', 'DHDB190601022', '2018/12/1', 307, 340000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('test13	p', '456', NULL, NULL, NULL, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES(' 奇瑞系统项目三期 ', 'DHDB200801098', '2020/8/1', 464, 340000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('咋就放那><>咋就放那', '789', '2022/12/12', 10, 100000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES(' .,test12,,..>>//3 ><>@#$%^&*,,。.?咋就放那?!!::;;“”‘’()()[]【||】{}…、─---~_—"&*,,..>>//3\\ ><>@#$%^&*,,。.??!!::;;“”‘’()()[]【】{}…─---~_—"&*  ', '123', '2022/12/12', 10, 100000, '2012-12-12 12:12:12');
INSERT INTO order_t (order_name, order_id, oder_time, amount, province_id, test_date) VALUES('奇 瑞 控 股- 系 统', 'DHDB190601022', '2019/3/1', 69, 340000, '2012-12-12 12:12:12');

将一个数据表某几个列转为行数据,并且要求顺序一致,如下图(图1转换前,图2转换后)

如果不要求顺序可以直接使用union处理

将图1的order_name和order_id转为表数据

图1:

图2:

 以下是执行的脚本:

SELECT
	oder_time, --表原始字段
	amount, --表原始字段
	province_id,--表原始字段
	test_date, --表原始字段
	'order_name' :: VARCHAR ( 100 ) ascoIdent, --将order_name列名转成列ascoIdent的数据
	order_name :: VARCHAR ( 300 ) AS valIdent, --将order_name的值转成列ascoIdent的数据
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids, --按照正常查询的顺序自增
	1 AS ida --默认第一条数据给1,第二条给2
FROM
	order_t 
    UNION ALL --合并
SELECT
	oder_time,
	amount,
	province_id,
	test_date,
	'order_id' :: VARCHAR ( 100 ) ascoIdent,
	order_id :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	2 AS ida 
FROM
	order_t 
ORDER BY
	ids,--排序
	ida --排序

将所有的列都转为数据类似,如下:

 脚本:

SELECT
	'order_name' :: VARCHAR ( 100 ) ascoIdent,
	order_name :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	1 AS ida 
FROM
	order_t UNION ALL
SELECT
	'order_id' :: VARCHAR ( 100 ) ascoIdent,
	order_id :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	2 AS ida 
FROM
	order_t UNION ALL
SELECT
	'oder_time' :: VARCHAR ( 100 ) ascoIdent,
	oder_time :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	3 AS ida 
FROM
	order_t UNION ALL
SELECT
	'amount' :: VARCHAR ( 100 ) ascoIdent,
	amount :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	4 AS ida 
FROM
	order_t UNION ALL
SELECT
	'province_id' :: VARCHAR ( 100 ) ascoIdent,
	province_id :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	5 AS ida 
FROM
	order_t UNION ALL
SELECT
	'test_date' :: VARCHAR ( 100 ) ascoIdent,
	test_date :: VARCHAR ( 300 ) AS valIdent,
	ROW_NUMBER ( ) OVER ( ORDER BY - 1 ) AS ids,
	6 AS ida 
FROM
	order_t 
ORDER BY
	ids,
	ida

              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值