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

SQL Server T-SQL行转列视图实现问题求助

T-SQL行转固定列(最多3列Col2)的正确实现方案

需求说明

需要创建T-SQL视图,将Table2中对应Table1的Col1值的Col2行数据转换为最多3个固定列,同时要包含Table1中所有Col1值(即使Table2中无对应数据),缺失值用NULL填充。之前使用OFFSET AND FETCH的方式只能返回单行,无法实现该需求。

现有表数据

Table1数据

Table 1
A
B
C
D

Table2数据

Table 2 Col 1Table 2 Col 2
AA1
AA2
AA3
BB1

正确实现方案

使用窗口函数+条件聚合的方式可以满足需求,同时通过LEFT JOIN确保Table1的所有Col1值都被包含:

CREATE VIEW vw_TransformedData AS
SELECT 
    t1.Col AS [Output Col 1],
    MAX(CASE WHEN rn = 1 THEN t2.Col2 END) AS [Output Col 2],
    MAX(CASE WHEN rn = 2 THEN t2.Col2 END) AS [Output Col 3],
    MAX(CASE WHEN rn = 3 THEN t2.Col2 END) AS [Output Col 4]
FROM 
    Table1 t1
LEFT JOIN (
    -- 给每个Col1分组内的Col2按顺序编号
    SELECT 
        Col1,
        Col2,
        ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2 ASC) AS rn
    FROM 
        Table2
) t2 ON t1.Col = t2.Col1
GROUP BY 
    t1.Col
ORDER BY 
    t1.Col;

方案解释

  1. 子查询编号:通过ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2 ASC)给每个Col1分组下的Col2数据按顺序标记序号(rn),区分第1、2、3个Col2值。
  2. LEFT JOIN关联:用Table1左连接子查询结果,确保Table1中所有Col1值(如C、D)都会出现在最终结果中,即使Table2中无对应数据。
  3. 条件聚合转列:使用MAX(CASE...)根据序号提取对应位置的Col2值,没有对应序号的返回NULL,通过GROUP BY聚合每个Col1的结果。

执行结果

该视图执行后会得到符合期望的输出:

Output Col 1Output Col 2Output Col 3Output Col 4
AA1A2A3
BB1NULLNULL
CNULLNULLNULL
DNULLNULLNULL

原方案不可行原因

原SQL中的OFFSET AND FETCH仅用于从结果集中提取指定偏移量的单行数据,无法对每个Col1分组进行行转列的聚合操作,完全不适用行转列的需求场景。

内容的提问来源于stack exchange,提问作者Seigfred Mondez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:25:54