postgre SQL 行转列的两种方式
查询的结果
我所需要的查询结果
第一种方法 crosstab(text sql)函数
select * from crosstab(
'select head_seq_no, --对应第一列, 根据这个值进行分类
review_desc, --对应下面的列名
review_detail_desc --对应类型的值
from 查询的表 group by 1,2' -- 需要排序 顺序正确才可以
)as t(head_seq_no int,门店卫生 varchar,门店形象 varchar,产品陈列 varchar,是否存储或销售合同外的产品 varchar,是否有促销执行 varchar,是否接受智店培训 varchar,是否正常使用智店 varchar) order by head_seq_no
固定写法:
中间的sql需要查询三个值,顺序不能变,
注意排序
注意下面列名的类型
第二种方法 group by + string_agg
select qq.head_seq_no,
string_agg(case qq.review_desc when '门店卫生' then qq.review_detail_desc else '' end, '') as 门店卫生,
string_agg(case qq.review_desc when '门店形象' then qq.review_detail_desc else '' end, '') as 门店形象,
string_agg(case qq.review_desc when '产品陈列' then qq.review_detail_desc else '' end, '') as 产品陈列,
string_agg(case qq.review_desc when '是否存储或销售合同外的产品' then qq.review_detail_desc else '' end, '') as 是否存储或销售合同外的产品,
string_agg(case qq.review_desc when '是否有促销执行' then qq.review_detail_desc else '' end, '') as 是否有促销执行,
string_agg(case qq.review_desc when '是否接受智店培训' then qq.review_detail_desc else '' end, '') as 是否接受智店培训,
string_agg(case qq.review_desc when '是否正常使用智店' then qq.review_detail_desc else '' end, '') as 是否正常使用智店
from 查询的表 qq group by qq.head_seq_no
字符串使用string_agg函数 如果查询结果为数字可使用sum函数