日期:2014-05-18  浏览次数:20658 次

求解!合并两张表的统计结果,数据大,可以用SQL或JAVA 求思路。在线等!!
环境:java、mysql数据库
情景:A表有t1、t2、t3、t4
      B表有t1、t2、t3、t4
A、B表的结构是一模一样的。现在的需求是对A表根据t1、t2、t3、t4进行分组得到结果集(countA、t1、t2、t3、t4),countA是各分组的记录数,B表操作同A表一样。最后要的结果集是(countB、t1、t2、t3、t4).
最后还要统计A表字段t5为success、wait状态的分组得到countAA,即:同A表一样先进行(t1、t2、t3、t4)分组统计,条件为t5字段的值为success或wait。结果集为:(countAA、t1、t2、t3、t4)。
最终得到的结果集为(countA、countAA、countB、t1、t2、t3、t4)。

我的思路是,分三次分组统计,最后根据t1、t2、t3、t4把3个临时表合并。但因为有几百万的数据,实际操作中分组字段还有增加,单对A表进行分组统计都需好十几秒,合并临时表更是耗时,搞不好数据库表会被锁死。

我还尝试过分3次查询,然后在java代码中对3个结果集进行for循环,然后根据t1、t2、t3、t4属性相等条件来合并结果集。但这样的循环有最低几十亿次,耗时也太长。

有人给个思路么,用sql 或者 java代码解决都行。
在线等!!!很急。

------解决方案--------------------
引用:
我怕大家搞混才这样写的,其实是这样的,t5其实就是t4,countAA是group by字段t1、t2、t3、t4,条件为t4是success、wait值

先别管这sql效率怎么样,这个sql符合你的要求吗?

select a.a, aa.aa, b.b, a.t1, a.t2, a.t3, a.t4
  from (select count(1) a, t1, t2, t3, t4 from A group by t1, t2, t3, t4) a
  left join (select count(1) aa, t1, t2, t3, t4
               from A where t4 = 'success' group by t1, t2, t3, t4) aa
    on a.t1 = aa.t1
   and a.t2 = aa.t2
   and a.t3 = aa.t3
   and a.t4 = aa.t4
  left join (select count(1) b, t1, t2, t3, t4
               from B group by t1, t2, t3, t4) b
    on b.t1 = aa.t1
   and b.t2 = aa.t2
   and b.t3 = aa.t3
   and b.t4 = aa.t4

------解决方案--------------------
帮你顶顶。。。
------解决方案--------------------
数据量大的情况,还需要从数据库本身入手去解决问题,可以考虑建立索引、视图或临时表来解决这种问题。
------解决方案--------------------
1,如果是数据库表设计的有问题,没法;
2,尝试各种表连接与过虑,看哪种更好。
------解决方案--------------------
两结果集union all,聚合一次,用行转列一次出来那几个查询列。