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,它可能很重要。
如何在 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,它可能很重要。