You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:24:37