SQL 垂直创建记录

SQL Create Record Vertically

如何在 SQL 中查询:

Name Year1 Year2 Year 3
Jack 400 500 600

对此:

Name YearX
Jack 400
Jack 500
Jack 600

您正在寻找逆轴操作。一种简单的方法使用 UNION ALL:

SELECT Name, Year1 AS YearX, 1 AS position FROM yourTable UNION ALL
SELECT Name, Year2, 2 FROM yourTable UNION ALL
SELECT Name, Year3, 3 FROM yourTable
ORDER BY position;

在 SQL 服务器中,我强烈建议使用 APPLY 进行反透视:

select t.name, v.yearx
from t cross apply
     (values (year1, 1), (year2, 2), (year3, 3)
     ) v(yearx, which);

请注意,如果您想要原始列,您可以 select 第二列 which

为什么我比 union all 更推荐这个?当然写起来更短

更重要的是,它只引用了一次原始的table,所以table只被扫描了一次。这是 table 的边际性能增益。如果“table”真的是一个视图或 CTE,它可能很重要。