主表有20W条左右的数据,平均每个月大概有1.5W条的记录增加,目前是通过SSIS的ETL在更新。
现在需要出一个报表,就是将记录中的字段【分类】中的值(例如A、B、C……,大概20+种)以列的方式展现出来,并汇总不同分类的销量。
刚刚用子查询的方式,做了一条记录(单个公司、单月),只做了6个分类,耗时大概在100s左右,部份代码如下图:
之前用Excel的方式处理,好处是可以只提取主表中的不同公司的某月记录,数量较少,再配合sumifs函数,大概所有公司的当月数据都可以在30s左右出来。
请教高手,有没有什么好的解决方法,可以提高这种 行转列 的效率?豆不多了,先感谢了。
切图不全,还有就是你的分类名称是不是如些(A1类,A1类,B1类,B2类,B3类...的规律)
你这样写就是每一个列,都起一个查询,事必会慢的!
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),提供语句,希望能帮到你!
@三瑞: 感谢大家的关注,提供了很多很好的思路,比如先group by后再行转行。
最终采纳了@三瑞 的答案,是因为这个语句直接就可以在主表上查询,我将substring表达式,换成了类似 (分类字段 in ('a1','a2',))这样的表达式,就实现了我要的效果。
最新大概18W条数据,在20s以内就查询出来了(20多个行转列的case)。
最终我再通过ETL将结果回写新建了一张表。
再次感谢大家。
先group by 年,月,公司,分类(大分类)计算出sum再行转列...应该比这样快把
用临时表先把数据处理一次,比如select from test where 年="2015" and 月="12" group by xxx。比如相同的条件数据,你可以先聚合一下,然后行转列的时候就可以用小表了。
另外in这种用法可以用多次查询来实现。select xxx from test where 分类名称='A1类' union select xxx from test where 分类名称='A2类'
把它写为存储过程,并且把所有的嵌套查询独立查询为视图,然后在java代码中调用。
先把基础数据处理完后放入临时表,再做行转列速度比较快
排序,分组