【问题标题】:SQL Create Record VerticallySQL 垂直创建记录
【发布时间】:2021-02-26 05:59:51
【问题描述】:

如何在 SQL 中查询:

Name Year1 Year2 Year 3
Jack 400 500 600

到这里:

Name YearX
Jack 400
Jack 500
Jack 600

【问题讨论】:

  • SO 不是免费的代码编写服务。向我们展示您尝试过的内容以及遇到问题的地方。并且在请求帮助时,以 DDL+DML 的形式提供您的示例数据,让我们的生活更轻松。您可能想查看UNPIVOT
  • 注意,感谢指出

标签: sql sql-server select pivot pivot-table


【解决方案1】:

您正在寻找非透视操作。一种简单的方法是使用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;

【讨论】:

  • 嗨蒂姆,感谢您的帮助。我想了解这个职位是做什么的?
  • UNIONUNION ALL 查询的结果与它查询的表类似,只是另一组无序记录。如果您想保证您在输出中似乎期望的顺序,则需要一个计算列。因此,我将位置编号添加到联合查询的每个部分,然后使用该位置进行排序。
【解决方案2】:

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

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

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

为什么我推荐这个而不是union all?当然,写的更短。

更重要的是,它只引用原始表一次,因此该表只被扫描一次。这是桌子上的边际性能增益。如果“表”确实是视图或 CTE,则可能很重要。

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    相关资源
    最近更新 更多