如何基于固定Brand值使用TSQL的Pivot函数实现行转列?
TSQL实现基于固定Brand值的行转列
针对你需求的行转列场景,因为Brand是固定的有限值(Adidas、Puma),这里提供两种可行的TSQL实现方式:
方法一:条件聚合(推荐,简洁直观)
这种方式通过CASE语句结合聚合函数直接生成目标列,逻辑清晰,适合固定维度的场景:
SELECT Id, -- 提取Adidas对应的Brand和Type MAX(CASE WHEN Brand = 'Adidas' THEN Brand END) AS [Brand Adidas], MAX(CASE WHEN Brand = 'Adidas' THEN Type END) AS [Type Adidas], -- 提取Puma对应的Brand和Type MAX(CASE WHEN Brand = 'Puma' THEN Brand END) AS [Brand Puma], MAX(CASE WHEN Brand = 'Puma' THEN Type END) AS [Type Puma] FROM YourTableName -- 替换为你的实际表名 GROUP BY Id ORDER BY Id;
逻辑说明
GROUP BY Id将同一Id的多行数据合并为一行CASE语句根据Brand值筛选出对应列的内容,因为每个Id下单个Brand仅对应一条记录,用MAX或MIN聚合函数都能准确获取目标值
方法二:使用Pivot+Unpivot函数
如果偏好使用Pivot语法,可以先通过Unpivot将原表的Brand、Type列转为键值对,再通过Pivot生成目标结构:
WITH UnpivotedData AS ( SELECT Id, -- 拼接属性名与Brand,生成Pivot的目标列名 CONCAT(Attribute, ' ', Brand) AS TargetColumn, AttributeValue FROM YourTableName -- 替换为你的实际表名 -- 将Brand和Type列转为Attribute(属性名)和AttributeValue(属性值) UNPIVOT ( AttributeValue FOR Attribute IN (Brand, Type) ) AS Unpvt ) SELECT Id, [Brand Adidas], [Type Adidas], [Brand Puma], [Type Puma] FROM UnpivotedData -- 将拼接后的列名转为表头 PIVOT ( MAX(AttributeValue) FOR TargetColumn IN ([Brand Adidas], [Type Adidas], [Brand Puma], [Type Puma]) ) AS Pvt ORDER BY Id;
逻辑说明
- Unpivot阶段:把原表中每个Id对应的Brand、Type列拆成
(Attribute, AttributeValue)的键值对,再拼接成Brand Adidas这类目标列名 - Pivot阶段:将拼接后的列名转为最终表头,同样用
MAX聚合确保每个Id对应列的唯一值被正确提取
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

