胡言乱语小笔记 --SQL

72 阅读1分钟
postgre SQL 行转列的两种方式

查询的结果

image.png

我所需要的查询结果 image.png

第一种方法 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函数