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 竖表变横表,自适应的,谁能帮看看。的主要内容,如果未能解决你的问题,请参考以下文章

sql 里面怎么把竖表变成横表

sql实现纵表变横表

oracle纵表转横表

swiper插件怎么设置响应式高度自适应?

sql竖表转横表

SQL竖表转换成横表统计