实例表结构和记录如下:
source         dest           length
192.168.5.1    192.168.2.3    27
192.168.5.1    192.168.2.5    466
192.168.5.2    192.168.2.5    2389
192.168.5.1    192.168.2.3    74
192.168.5.3    192.168.2.137  6890
192.168.5.2    192.168.2.137  389以上表为例,组合就有
source=192.168.5.1 and dest=192.168.2.3
source=192.168.5.1 and dest=192.168.2.5
source=192.168.5.1 and dest=192.168.2.137source=192.168.5.2 and dest=192.168.2.3
source=192.168.5.2 and dest=192.168.2.5
source=192.168.5.2 and dest=192.168.2.137source=192.168.5.3 and dest=192.168.2.3
source=192.168.5.3 and dest=192.168.2.5
source=192.168.5.3 and dest=192.168.2.137
要计算9种组合的记录数和length
需要按照这些不同的组合分别统计其记录数和length总量,怎么写语句?

解决方案 »

  1.   

    select from c.source, c.dest, count(*) 
          (select source, dest 
             from (select distinct source from tab) a, 
                  (select distinct dest   from tab) b ) c, tab d
      where c.source = d.source(+)
        and c.dest  = d.dest(+)
      

  2.   

    上一贴有问题,没有测试环境,看一下这个行不?
    select from c.source, c.dest, count(*),sum(length_user) 
      (select source, dest  
      from (select distinct source from tab) a,  
      (select distinct dest from tab) b ) c, tab d
       where c.source = d.source(+)
       and c.dest = d.dest(+)
      group by c.source, c.dest
      

  3.   

    有两种解决方案,这个取决于你的数据中不存在的分组(例如:source=192.168.5.3 and dest=192.168.2.3)是否要出现在结果中。下面的例句中假设表名为TAB方案一:不存在的分组在结果中不出现
    SELECT COUNT(*),SUM(LENGTH) FROM TAB GROUP BY SOURCE,DEST方案二:不存在的分组在结果中出现,得到的值为0
    SELECT  A.SOURCE,B.DEST,COUNT(LENGTH),NVL(SUM(LENGTH),0)
    FROM (SELECT DISTINCT SOURCE FROM TAB) A 
    CROSS JOIN (SELECT DISTINCT DEST FROM TAB) B
    LEFT JOIN TAB C ON A.SOURCE = C.SOURCE AND B.DEST = C.DEST
    GROUP BY A.SOURCE,B.DEST
    ORDER BY  A.SOURCE,B.DEST;
      

  4.   

    聚合source,聚合dest,把两个结果集full Join
      

  5.   

    方案一:不存在的分组在结果中不出现
    SELECT COUNT(*),SUM(LENGTH) FROM TAB GROUP BY SOURCE,DEST方案二:不存在的分组在结果中出现,得到的值为0
    SELECT A.SOURCE,B.DEST,COUNT(LENGTH),NVL(SUM(LENGTH),0)
    FROM (SELECT DISTINCT SOURCE FROM TAB) A  
    CROSS JOIN (SELECT DISTINCT DEST FROM TAB) B
    LEFT JOIN TAB C ON A.SOURCE = C.SOURCE AND B.DEST = C.DEST
    GROUP BY A.SOURCE,B.DEST
    ORDER BY A.SOURCE,B.DEST;