数据库 :postgresql 版本11
现在需要对数据进行处理
我需求的 样式
名字 | 2022-1-1 | 2022-1-2 | 2022-1-3 | 2022-1-4 | 2022-1-5 | 2022-1-6 | 2022-1-7 | 2022-1-8 | 2022-1-9 | ------ |
---|---|---|---|---|---|---|---|---|---|---|
张三 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | ------ |
李四 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | ------ |
王五 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | 值 | ------ |
------ | ------ | .------. | ------ | ------ | ------. | ------ | ------ | ------ | ------ | ------ |
我现在的数据
名字 | 时间 | 值 |
---|---|---|
张三 | 2022-1-1 | 1 |
李四 | 2022-1-1 | 2 |
王五 | 2022-1-1 | 1 |
张三 | 2022-1-2 | 3 |
李四 | 2022-1-2 | 4 |
李四 | 2022-1-3 | 1 |
------ | ------ | ------ |
由于需要按时间进行行转列,时间是最近三个月。该如何实现?
我试过case when ,和pg 的crosstab 函数 ,但是都需要把列名写出来,有没有什么简单的方式,主要不需要写列名,毕竟三个月实在是太多了
首先,数字开头的字符串是不能作为字段名的,而且“-”这个符号也不能包含在字段名内,因为可能会被认为是减号,因此目前无法实现你问题中要求的这个效果。
然后,假设你字段名改一下,比如 d20220101,d20220102 ...这样,其实可以先用sql拼接的方式先把正确的sql拼接出来再去执行
---测试数据
CREATE TABLE exams2 (
name varchar(15),
exam date,
value int
);
insert into exams2 (name,exam,value) values ('Bob','2021-01-01',70);
insert into exams2 (name,exam,value) values ('Bob','2021-01-02',77);
insert into exams2 (name,exam,value) values ('Bob','2021-01-03',71);
insert into exams2 (name,exam,value) values ('Bob','2021-01-04',70);
insert into exams2 (name,exam,value) values ('Sue','2021-01-01',89);
insert into exams2 (name,exam,value) values ('Sue','2021-01-02',87);
insert into exams2 (name,exam,value) values ('Sue','2021-01-03',88);
insert into exams2 (name,exam,value) values ('Sue','2021-01-04',89);
---拼接sql
select 'SELECT * FROM crosstab(''select name ,exam , value from exams2 order by 1,2'') as ct (name varchar(20),'
|| string_agg(e||' int',',' order by e) ||');' from (
select distinct 'd'||to_char(exam,'yyyymmdd') e from exams2 ) t;
---执行上面的查询后,可以得到下面这个sql的字符串,复制出来再去执行即可
SELECT * FROM crosstab('select name ,exam , value from exams2 order by 1,2') as ct (name varchar(20),d20210101 int,d20210102 int,d20210103 int,d20210104 int);
另外,官方文档中提供了一个crosstabN的用法,除了N为2/3/4以外,更多的列需要你自行定义一个type,在type中去定义有哪些字段以及字段类型,这样在查询的时候就不用去传那一串东西了
http://www.postgres.cn/docs/13/tablefunc.html
👍