在Databricks SQL中实现行转列的动态转换方法
Databricks SQL行转列实现方案
针对你这种商品属性行存储转列存储的需求,Databricks SQL有两种常用的实现方式:
方法一:使用PIVOT函数(推荐)
PIVOT是SQL中专门用于行转列的语法,适合已知属性列名的场景,代码简洁高效:
SELECT * FROM ( SELECT Article, Attribute, Value FROM your_table_name -- 替换成你的实际表名 ) PIVOT ( MAX(Value) -- 每个Article+Attribute组合唯一,用MAX/MIN/ANY_VALUE效果一致 FOR Attribute IN ( 'Name' AS Name, 'Size' AS Size, 'Price' AS Price, 'Costs' AS Costs, 'Department' AS Department ) ) ORDER BY Article;
说明:
- 内层子查询先提取核心的三列数据;
PIVOT子句中用聚合函数锁定每个属性对应的值,因为同一商品的同一属性只会有一条记录,所以任意聚合函数都能得到正确结果;FOR Attribute IN列出所有需要转成列的属性,并指定最终列名;- 缺失属性的商品对应列会自动填充为
NULL。
执行后得到的结果如下:
Article Name Size Price Costs Department A Bike S 5 4 3 CR B Bike M 5 4 NULL NULL C Bike L NULL NULL NULL NULL
方法二:使用CASE WHEN + 聚合函数
如果需要更灵活的控制(比如对不同属性做类型转换),可以用CASE结合聚合函数的方式:
SELECT Article, MAX(CASE WHEN Attribute = 'Name' THEN Value END) AS Name, CAST(MAX(CASE WHEN Attribute = 'Size' THEN Value END) AS INT) AS Size, CAST(MAX(CASE WHEN Attribute = 'Price' THEN Value END) AS INT) AS Price, CAST(MAX(CASE WHEN Attribute = 'Costs' THEN Value END) AS INT) AS Costs, MAX(CASE WHEN Attribute = 'Department' THEN Value END) AS Department FROM your_table_name -- 替换成你的实际表名 GROUP BY Article ORDER BY Article;
说明:
- 每个CASE WHEN语句对应一个目标列,筛选出对应属性的值;
- 用MAX聚合函数确保每个商品只返回一条记录;
- 可以通过
CAST函数将数字类型的属性(比如Size、Price)转换成INT,避免以字符串形式存储; - 缺失属性的列同样会填充为
NULL。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

