首页 新闻 会员 周边

20W+条数据,行转列,效率很低,怎么解决?

0
悬赏园豆:10 [已解决问题] 解决于 2016-01-30 17:59

主表有20W条左右的数据,平均每个月大概有1.5W条的记录增加,目前是通过SSIS的ETL在更新。

现在需要出一个报表,就是将记录中的字段【分类】中的值(例如A、B、C……,大概20+种)以列的方式展现出来,并汇总不同分类的销量。

刚刚用子查询的方式,做了一条记录(单个公司、单月),只做了6个分类,耗时大概在100s左右,部份代码如下图:

之前用Excel的方式处理,好处是可以只提取主表中的不同公司的某月记录,数量较少,再配合sumifs函数,大概所有公司的当月数据都可以在30s左右出来。

请教高手,有没有什么好的解决方法,可以提高这种 行转列 的效率?豆不多了,先感谢了。

sfrost的主页 sfrost | 初学一级 | 园豆:9
提问于:2016-01-27 23:36
< >
分享
最佳答案
1

切图不全,还有就是你的分类名称是不是如些(A1类,A1类,B1类,B2类,B3类...的规律)

你这样写就是每一个列,都起一个查询,事必会慢的!

收获园豆:10
三瑞 | 菜鸟二级 |园豆:232 | 2016-01-28 10:42

select [统计公司名称] as 统计公司,[年],[月],
sum(case when substring(分类名称,1,1)='A' then 销量 else 0 end) A类,
sum(case when substring(分类名称,1,1)='B' then 销量 else 0 end) B类
from test
where [年]=2015 and [月]=2 and [统计公司名称]='北京分司'
group by [统计公司名称],[年],[月]

 

这是个行转列的问题,但因为你不是明确按上A类,B类来存的,所以不能使用,SQL2005中的窗体函数来解决(pivot for in),提供语句,希望能帮到你!

三瑞 | 园豆:232 (菜鸟二级) | 2016-01-28 11:21

@三瑞: 感谢大家的关注,提供了很多很好的思路,比如先group by后再行转行。

最终采纳了@三瑞 的答案,是因为这个语句直接就可以在主表上查询,我将substring表达式,换成了类似 (分类字段 in ('a1','a2',))这样的表达式,就实现了我要的效果。

最新大概18W条数据,在20s以内就查询出来了(20多个行转列的case)。

最终我再通过ETL将结果回写新建了一张表。

再次感谢大家。

sfrost | 园豆:9 (初学一级) | 2016-01-30 18:03
其他回答(5)
1

先group by 年,月,公司,分类(大分类)计算出sum再行转列...应该比这样快把

让你笑了 | 园豆:103 (初学一级) | 2016-01-28 06:44
1

用临时表先把数据处理一次,比如select from test where 年="2015" and 月="12" group by xxx。比如相同的条件数据,你可以先聚合一下,然后行转列的时候就可以用小表了。

另外in这种用法可以用多次查询来实现。select xxx from test where 分类名称='A1类' union select xxx from test where  分类名称='A2类'

幻天芒 | 园豆:37175 (高人七级) | 2016-01-28 09:08
1

把它写为存储过程,并且把所有的嵌套查询独立查询为视图,然后在java代码中调用。

stephenyindz | 园豆:202 (菜鸟二级) | 2016-01-28 09:18
1

先把基础数据处理完后放入临时表,再做行转列速度比较快

webaspx | 园豆:1973 (小虾三级) | 2016-01-28 10:18
1

排序,分组

搁忆 | 园豆:612 (小虾三级) | 2016-01-28 15:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册