【问题标题】:Transpose / Pivot rows to columns将行转置/透视到列
【发布时间】:2013-07-29 16:15:02
【问题描述】:

我正在尝试转置(Pivot?)表格。这是我目前的设置。
当前表:

ID | Value
1  | 10
1  | 11
1  | 12
1  | 13
1  | 14
2  | 123
3  | 13423
3  | 1134
3  | 1234

求如下结果:

ID | Value01 | Value 02 | Value 03 | Value 04 | Value 05
1  |  10     |  11      |   12     |   13     |  14
2  |  123
3  | 13423   | 1134     | 1234

目前我正在尝试使用PIVOT,但是我不完全确定如何在没有“类别列”(例如几天或几个月)的情况下使用PIVOT。我可以为此使用ID 列吗?

SELECT ID, Value, [0], [1], [2], [3], [4] 
FROM (
      SELECT ID, Value FROM dbo.TABLE
) SourceTable 
PIVOT (
      VALUE FOR ID IN ([0], [1], [2], [3], [4])
) AS PivotTable

每个ID 没有预设数量的VALUE。但是如果要求它有一个已知的数字,5 个值(因此 5 列)就足够了。

【问题讨论】:

    标签: sql-server tsql pivot transpose


    【解决方案1】:

    您当前的查询已关闭,您缺少想要作为新列名的值。我的建议是使用row_number(),它将在每个id 上创建一个递增值,然后您可以使用 PIVOT 函数为每个序列值返回max(value)

    SELECT ID, [0], [1], [2], [3], [4] 
    FROM 
    (
      SELECT ID, Value, 
        row_number() over(partition by id 
                            order by id) -1  seq
      FROM yourtable
    ) SourceTable 
    PIVOT 
    (
      max(VALUE)
      FOR seq IN ([0], [1], [2], [3], [4])
    ) AS PivotTable;
    

    SQL Fiddle with Demo

    【讨论】:

    • +1 请注意,如果没有额外的列进行排序,每列中值的位置可能与问题中所示的垂直方向不匹配。也万岁留宿! :-)
    • 谢谢!我在row_number() .. order by ..添加了desc
    • 感谢 Aaron 的评论,方向无需匹配(问题纯属巧合);只要选择了最多 5 个值。
    • @Ben 好的,但同样重要的是要注意,我们不知道您所说的“最大 5”是什么意思,如果您有 6 个值,则无法保证将包含哪 5 个值。将 ORDER BY 更改为 ORDER BY DESC 不会改变这一点。
    • 对于“max 5”,我的意思是从值列表中选择 5 个最大值。 ORDER BY DESC 不会强制执行吗?
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2021-12-27
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多