TSQL中如何实现指定测试表数据的行转列查询
TSQL 行转列实现方案
你当前需求是按date_from、first_name维度分组,将不同code对应的total值转为独立列展示,TSQL中可以通过两种常用思路实现:
- 静态列写法(适合
code取值固定的场景,写法简单性能好)
当你明确知道code只有1、2两个固定值时,可直接使用内置PIVOT运算符实现透视:
SELECT date_from, first_name, [1] AS code_1_total, [2] AS code_2_total FROM test PIVOT ( -- 因为每个(日期,姓名,code)组合只有一条数据,用SUM/MAX聚合结果一致 SUM(total) FOR code IN ([1], [2]) ) AS pivot_result ORDER BY first_name, date_from;
- 动态列写法(适合
code取值不固定、后续可能新增的场景)
如果后续code可能新增枚举值,不想每次修改查询语句,可以用动态SQL自动生成透视列,无需手动维护列清单:
DECLARE @col_list NVARCHAR(MAX), @exec_sql NVARCHAR(MAX); -- 拉取表中所有不重复的code,生成符合语法要求的带方括号列名列表 SELECT @col_list = STUFF( (SELECT DISTINCT ',' + QUOTENAME(code) FROM test FOR XML PATH(''), TYPE) .value('.', 'NVARCHAR(MAX)'), 1,1,''); -- 拼接完整透视查询语句 SET @exec_sql = ' SELECT date_from, first_name, ' + @col_list + ' FROM test PIVOT( SUM(total) FOR code IN (' + @col_list + ') ) AS pivot_result ORDER BY first_name, date_from'; -- 执行语句返回结果 EXEC sp_executesql @exec_sql;
除了PIVOT语法,也可以用CASE WHEN加分组聚合的传统写法实现,逻辑更易理解,适配所有SQL版本:
SELECT date_from, first_name, SUM(CASE WHEN code = 1 THEN total END) AS code_1_total, SUM(CASE WHEN code = 2 THEN total END) AS code_2_total FROM test GROUP BY date_from, first_name ORDER BY first_name, date_from;
运行上述任意一种静态写法,得到的结果都和你预期的格式一致,效果参考:
内容的提问来源于stack exchange,提问作者user_odoo
相关产品推荐
相关产品推荐

