【问题标题】:Find T-SQL to Transpose A Table By Chunks查找 T-SQL 以按块转置表
【发布时间】:2014-04-10 00:55:35
【问题描述】:

我正在寻找使用 T-SQL 执行此操作的最简洁、最短、最简单和最有效的方法。我希望单一的方式是所有这些事情,但我意识到它可能不是。

我已经尝试(不成功)使用 PIVOT,但我认为我需要的是按块进行 PIVOT 并且不聚合

我查询了一个大表来得到这个结果: (结果按年份按 Number 降序排列。Number 是给定年份以该姓名出生的人的出现次数)

Name    Number  Year
John    9655    1880
William 9532    1880
James   5927    1880
Charles 5348    1880
George  5126    1880
John    8769    1881
William 8524    1881
Charles 5442    1881
George  4664    1881
James   4636    1881
John    9557    1882
James   9298    1882
William 5892    1882
George  5193    1882
Charles 5092    1882

我想把上面的结果变成这样:

1880    1881    1882
John    John    John
William William James
James   Charles William
Charles George  George
George  James   Charles

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    您可以使用 PIVOT 来获取结果,您唯一需要做的就是添加一个 row_number(),它是通过按 year 对数据进行分区生成的,按 number 排序。然后,此唯一序列允许您在应用聚合函数时为每年返回多行。此外,由于您要转换字符串数据,您需要使用 maxmin 聚合函数:

    select [1880], [1881], [1882]
    from
    (
      select name, year,
        row_number() over(partition by year
                          order by number desc) seq
      from yourtable
    ) d
    pivot
    (
      max(name)
      for year in ([1880], [1881], [1882])
    ) p;
    

    SQL Fiddle with Demo。返回:

    |    1880 |    1881 |    1882 |
    |---------|---------|---------|
    |    John |    John |    John |
    | William | William |   James |
    |   James | Charles | William |
    | Charles |  George |  George |
    |  George |   James | Charles |
    

    【讨论】:

    • row_number() 给了我唯一的序列,它允许每年返回多行。如果存在,我可以改为使用每条记录的 uniqueid 字段吗?还是必须是按年份对数据进行分区生成的row_number(),按Number DESC排序?
    • @JLee 这真的取决于,你必须在你的实际数据上使用它,看看它是否会起作用。我使用了它,因此您可以按照您想要的顺序生成序列 - 按数字降序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2016-02-12
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多