SQL 竖表变横表,自适应的,谁能帮看看。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 参考技术A 用sql本身难以实现。 你可以对生成的竖表(转成csv格式 或 txt 格式)文件,再用pascal 或 c 语言编制转换程序 进行后处理。 参考技术B 用存储过程
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
sql 编写横竖表转换
将横表转为竖表,基本思想是:
1)将横表的多条数据,"压"成一条.相当于将这么多条分组,每组"压"成一条数据.利用group by
2) 再对竖表中的列,由特定行的数据填充,利用case when ‘a‘ then ‘b‘ else 没有用的值 end,为了过滤一些没有用的数据,常用的函数有max(), sum()
ps:如果没有聚合函数帅选.数据库会把第一个数据返回给你,基本就是刚刚你填写"没有用的值"
下面是例子:
SELECT NAME ,MAX(CASE SUBJECT when ‘语文‘ THEN Result ELSE 0 END ) 语文, MAX(CASE SUBJECT WHEN ‘数学‘ THEN Result ELSE 0 END) 数学, MAX(CASE SUBJECT WHEN ‘物理‘ THEN Result ELSE 0 END) 物理 from tb GROUP BY `Name`
得到结果是
以上是关于SQL 竖表变横表,自适应的,谁能帮看看。的主要内容,如果未能解决你的问题,请参考以下文章