如何用SQL UNPIVOT将Total1等列转为行?查询调试求助
解决方法
你的需求是将每条记录拆分为两行,分别展示Cost和Total1的值(对应另一列留空),原查询的问题在于UNPIVOT的使用逻辑和列映射不对,这里提供两种可行的修改方案:
方案一:用UNION ALL实现(逻辑更直观)
直接拆分两种场景并合并结果,保证同一用户的两行相邻:
-- 展示Cost值,Total1留空 SELECT Name, Cost, NULL AS Total1 FROM mytable UNION ALL -- 展示Total1值,Cost留空 SELECT Name, NULL AS Cost, Total1 FROM mytable ORDER BY Name;
方案二:调整UNPIVOT的用法
如果坚持用UNPIVOT,需要先把Cost和Total1都纳入转置范围,再通过CASE把值映射回原列:
SELECT Name, CASE WHEN indicatorname = 'Cost' THEN indicatorvalue END AS Cost, CASE WHEN indicatorname = 'Total1' THEN indicatorvalue END AS Total1 FROM mytable UNPIVOT ( indicatorvalue FOR indicatorname IN (Cost, Total1) -- 必须包含要拆分的两列 ) unpiv ORDER BY Name;
原查询的问题点
SELECT子句中列的分隔错误,缺少逗号(正确写法应为select Name, cost, total1, indicatorname, indicatorvalue)UNPIVOT仅指定了total1,没有包含Cost,无法生成两行记录- 未将转置后的键值对映射回原列结构,导致输出格式和预期不符
执行上述方案后,会得到你期望的结果:
Name Cost Total1 Joe 5 NULL Joe NULL 10 Bob 7 NULL Bob NULL 15 Tom 20 NULL Tom NULL 1
内容的提问来源于stack exchange,提问作者Newstar
相关产品推荐
相关产品推荐

