上一篇
📢 最新动态
2025年7月,随着数据分析需求激增,SQL的行列转换技术依然是面试高频考点,据最新统计,85%的数据分析师在ETL(数据提取、转换、加载)过程中仍需频繁处理行列转换问题,今天我们就来彻底搞懂这个"老熟人"!
数据存储和展示的需求往往不同:
举个栗子🌰:
原始销售数据可能是每天一行,但老板想看"每个产品在各月的总销量",这时候就需要行转列!
SELECT product_id, SUM(CASE WHEN month = '2025-01' THEN sales ELSE 0 END) AS jan_sales, SUM(CASE WHEN month = '2025-02' THEN sales ELSE 0 END) AS feb_sales FROM sales_data GROUP BY product_id;
PIVOT
语法(需CTE配合) PIVOT
关键字 -- SQL Server示例 SELECT * FROM ( SELECT product_id, month, sales FROM sales_data ) AS src PIVOT ( SUM(sales) FOR month IN ([2025-01], [2025-02]) ) AS pvt;
当列不固定时,可能需要动态SQL(存储过程实现):
-- PostgreSQL示例 EXECUTE ( SELECT 'SELECT product_id, ' || string_agg('SUM(CASE WHEN month = ''' || month || ''' THEN sales END) AS ' || month || '_sales', ', ') || ' FROM sales_data GROUP BY product_id' FROM (SELECT DISTINCT month FROM sales_data) t );
SELECT product_id, '2025-01' AS month, jan_sales AS sales FROM sales_pivoted UNION ALL SELECT product_id, '2025-02' AS month, feb_sales AS sales FROM sales_pivoted;
SQL Server: UNPIVOT
关键字
SELECT product_id, month, sales FROM sales_pivoted UNPIVOT ( sales FOR month IN (jan_sales, feb_sales) ) AS unpvt;
PostgreSQL: CROSS JOIN LATERAL
+ jsonb
SELECT product_id, kv.key AS month, kv.value::int AS sales FROM sales_pivoted CROSS JOIN LATERAL jsonb_each_text( jsonb_build_object( '2025-01', jan_sales, '2025-02', feb_sales ) ) AS kv;
COALESCE(sales, 0)
避免空值干扰 PIVOT/UNPIVOT
语法在不同DBMS中差异较大 2025年部分云数据库已支持更简洁语法:
PIVOT
支持动态列名自动检测 UNPIVOT INCLUDE NULLS
可保留空值记录 🎯 总结
行列转换就像数据界的"变形金刚",掌握后能让数据随心所欲变换形态!
CASE WHEN
或PIVOT
UNION ALL
或UNPIVOT
下次面试官再问这个问题,你可以自信地说:"这题我熟!" 💪
本文由 庾黎昕 于2025-07-31发表在【云服务器提供商】,文中图片由(庾黎昕)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/494232.html
发表评论