SQL查询需求:将指定列转换为行(行列转置)
SQL列转行:将纯度(karatage)、单位重量(Unit weight)转为行
原始数据示例
假设你的原始查询结果结构如下:
Location quantity karatage Unit weight A 10 18K 5g A 15 24K 3g B 8 18K 4g B 6 24K 2g
目标输出格式
期望得到的结果(按Location聚合,将纯度对应的数量、单位重量转为列):
Location 18K_quantity 18K_Unit weight 24K_quantity 24K_Unit weight A 10 5g 15 3g B 8 4g 6 2g
解决方案
1. 通用数据库兼容方案(CASE+聚合函数)
这种方法适用于MySQL、PostgreSQL、SQL Server等绝大多数数据库,无需依赖特定语法:
SELECT Location, -- 提取18K对应的数量和单位重量 MAX(CASE WHEN karatage = '18K' THEN quantity END) AS `18K_quantity`, MAX(CASE WHEN karatage = '18K' THEN `Unit weight` END) AS `18K_Unit weight`, -- 提取24K对应的数量和单位重量 MAX(CASE WHEN karatage = '24K' THEN quantity END) AS `24K_quantity`, MAX(CASE WHEN karatage = '24K' THEN `Unit weight` END) AS `24K_Unit weight` FROM your_table -- 替换为你的表名或原始查询语句 GROUP BY Location;
说明:如果有更多纯度类型(如14K),只需新增对应的CASE分支即可,聚合函数用MAX/MIN均可,因为同一Location+纯度组合只会有一个值。
2. SQL Server专用方案(PIVOT语法)
如果使用SQL Server,可以利用PIVOT语法简化操作:
SELECT Location, [18K_quantity], [18K_Unit weight], [24K_quantity], [24K_Unit weight] FROM ( -- 先构造转置所需的列名和对应值 SELECT Location, CONCAT(karatage, '_quantity') AS pivot_col_qty, quantity AS pivot_val_qty, CONCAT(karatage, '_Unit weight') AS pivot_col_weight, `Unit weight` AS pivot_val_weight FROM your_table -- 替换为你的表名或原始查询语句 ) AS src -- 对数量进行转置 PIVOT ( MAX(pivot_val_qty) FOR pivot_col_qty IN ([18K_quantity], [24K_quantity]) ) AS pvt_qty -- 对单位重量进行转置 PIVOT ( MAX(pivot_val_weight) FOR pivot_col_weight IN ([18K_Unit weight], [24K_Unit weight]) ) AS pvt_weight;
内容的提问来源于stack exchange,提问作者MohanKanal
相关产品推荐
相关产品推荐

