我正在寻找使用T-SQL做到这一点的最干净,最简单,最简单,最有效的方法。我希望单一的方式就是所有这些,但我意识到它可能不是。
我尝试过使用PIVOT(但没有成功),但我认为我需要的是通过块进行PIVOT而不进行聚合
我查询了一个大表来获得这个结果: (结果按年份按数字递减排序。数字是在给定年份中出生时具有该名称的人数)
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
答案 0 :(得分:1)
您可以使用PIVOT获取结果,您唯一需要做的就是添加row_number()
,该year
是按number
排序的max
分区数据生成的。这个唯一序列允许您在应用聚合函数时每年返回多行。此外,由于您要转换字符串数据,您需要使用min
或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;
聚合函数:
| 1880 | 1881 | 1882 |
|---------|---------|---------|
| John | John | John |
| William | William | James |
| James | Charles | William |
| Charles | George | George |
| George | James | Charles |
见SQL Fiddle with Demo。返回:
{{1}}