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 1 | Table 2 Col 2 |
|---|---|
| A | A1 |
| A | A2 |
| A | A3 |
| B | B1 |
正确实现方案
使用窗口函数+条件聚合的方式可以满足需求,同时通过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;
方案解释
- 子查询编号:通过
ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col2 ASC)给每个Col1分组下的Col2数据按顺序标记序号(rn),区分第1、2、3个Col2值。 - LEFT JOIN关联:用Table1左连接子查询结果,确保Table1中所有Col1值(如C、D)都会出现在最终结果中,即使Table2中无对应数据。
- 条件聚合转列:使用
MAX(CASE...)根据序号提取对应位置的Col2值,没有对应序号的返回NULL,通过GROUP BY聚合每个Col1的结果。
执行结果
该视图执行后会得到符合期望的输出:
| Output Col 1 | Output Col 2 | Output Col 3 | Output Col 4 |
|---|---|---|---|
| A | A1 | A2 | A3 |
| B | B1 | NULL | NULL |
| C | NULL | NULL | NULL |
| D | NULL | NULL | NULL |
原方案不可行原因
原SQL中的OFFSET AND FETCH仅用于从结果集中提取指定偏移量的单行数据,无法对每个Col1分组进行行转列的聚合操作,完全不适用行转列的需求场景。
内容的提问来源于stack exchange,提问作者Seigfred Mondez
相关产品推荐
相关产品推荐

