如何参照Table 2的ItemName选取Table 1的列并重构表头?
问题描述
现有两张数据表:
Table 1
| RowID | A1 | A2 | A3 |
|---|---|---|---|
| 1 | 1 | 1.0 | 0.1 |
| 2 | 2 | 2.0 | 0.2 |
Table 2
| Item Name | Cell location |
|---|---|
| Item1 | A1 |
| Item2 | A3 |
| Item3 | A2 |
需求:参照Table 2中Item Name与Cell location的映射关系,选取Table 1对应列并将表头替换为Item Name,得到最终表:
目标结果
| RowID | Item1 | Item2 | Item3 |
|---|---|---|---|
| 1 | 1 | 0.1 | 1.0 |
| 2 | 2 | 0.2 | 2.0 |
已尝试对Table 2使用PIVOT和LEFT JOIN,寻求正确实现方法。
解决方案
静态实现(映射固定)
如果Table 2的映射关系不会变动,直接根据映射给Table 1的列重命名即可,这是最简单高效的方式:
SELECT RowID, A1 AS Item1, A3 AS Item2, A2 AS Item3 FROM Table1;
动态实现(映射可变)
如果Table 2的映射可能新增、修改,需要用动态SQL自动适配映射关系:
DECLARE @sql NVARCHAR(MAX); -- 生成列别名映射片段 SELECT @sql = STRING_AGG( QUOTENAME([Cell location]) + ' AS ' + QUOTENAME([Item Name]), ', ' ) FROM Table2; -- 拼接完整查询语句 SET @sql = 'SELECT RowID, ' + @sql + ' FROM Table1'; -- 执行动态SQL EXEC sp_executesql @sql;
说明:动态SQL会自动读取Table 2中的映射规则,生成对应的列别名,无需手动修改查询语句即可适配映射变化。
内容的提问来源于stack exchange,提问作者Rahul Prajapati
相关产品推荐
相关产品推荐

