如何高效实现SQL键值对数据的PIVOT(行转列)操作
高效实现键值对转宽表(替代多次LEFT JOIN)
针对大数据量下的键值对转宽表需求,条件聚合是远优于多次LEFT JOIN的方案,只需要扫描一次数据表,避免了多表关联带来的性能开销。
原问题场景
原始键值对数据:
CustomerId BookKey BookValue John Title Goosebumps John Count 5 Max Title Harry Potter Max Count 7 Max Pages 50
需要转成宽表格式:
CustomerId Title Count Pages John GooseBumps 5 - Max Harry Potter 7 50
高效实现代码
SELECT CustomerId, COALESCE(MAX(CASE WHEN BookKey = 'Title' THEN BookValue END), '-') AS Title, COALESCE(MAX(CASE WHEN BookKey = 'Count' THEN BookValue END), '-') AS Count, COALESCE(MAX(CASE WHEN BookKey = 'Pages' THEN BookValue END), '-') AS Pages FROM data_bags GROUP BY CustomerId;
方案优势
- 仅扫描一次
data_bags表,避免多次LEFT JOIN带来的重复IO和关联计算,大数据量下性能提升明显 - 逻辑简洁,扩展性强:新增BookKey字段时,只需添加对应的
CASE WHEN分支即可,无需新增JOIN语句 - 结果与原LEFT JOIN逻辑一致:缺失的字段值用
COALESCE替换为-,和原需求的输出格式匹配
补充说明
如果不需要将NULL替换为-,可以去掉COALESCE函数,直接使用MAX(CASE ...)即可,结果会显示NULL。
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

