SQL 竖表变横表,自适应的,谁能帮看看。

GEOID NAME PROVIDER_I10540 A 3310540 A 9810540 A 15110540 A 23710540 A 26810540 A 31410580 B 210580 B 37010740 C 510900 D 22110900 D 222。。。。。变成GEOID NAME PROVIDER_I_1 PROVIDER_I_2 PROVIDER_I_3 PROVIDER_I_4 PROVIDER_I_5 PROVIDER_I_610540 A 33 98 151 237 268 31410580 B 2 370 NULL NULL NULL NULL10740 C 5 NULL NULL NULL NULL NULL10900 D 221 222 NULL NULL NULL NULL

--case when 和 row_number() over (partition by order by )解决
--表名为#a,这个只是个例子具体有多少个provider_i需要从与num的最大值一致,或者写个循环语句
select b.geoid,b.name,
sum(case when b.num=1 then provider_i end) provider_i_1 ,
sum(case when b.num=2 then provider_i end) provider_i_2,
sum(case when b.num=3 then provider_i end) provider_i_3,
sum(case when b.num=4 then provider_i end) provider_i_4,
sum(case when b.num=5 then provider_i end) provider_i_5,
sum(case when b.num=6 then provider_i end) provider_i_6 
from (select geoid,name,provider_i,ROW_NUMBER() over(partition by name order by name) num from #a ) b group by b.geoid,b.name

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-09-08
用sql本身难以实现。 你可以对生成的竖表(转成csv格式 或 txt 格式)文件,再用pascal 或 c 语言编制转换程序 进行后处理。
第2个回答  2016-09-08
用存储过程
1, 增加排序列,按照GEOID和NAME分组,按PROVIDER_I排序。
2,得到每组中最大的排序号m
3,拼接子字符串
@subsql += ",max(case when 序号="+n+" then PROVIDER_I else null end) PROVIDER_I_"+n; -- n从1到m
4, 拼接字符串
@sql = "select GEOID, NAME" + @subsql
+ "from 带序号的table
group by GEOID, NAME"
5, 执行 @sql本回答被网友采纳
相似回答