怎样写group by处理交叉组合的统计?

yeswhb 2012-10-16 03:18:38
实例表结构和记录如下:
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.137

source=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.137

source=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总量,怎么写语句?
...全文
195 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
onejune4450 2012-10-17
  • 打赏
  • 举报
回复
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(+)
yeswhb 2012-10-17
  • 打赏
  • 举报
回复
请帮忙解答,急。
yeswhb 2012-10-17
  • 打赏
  • 举报
回复
有人帮忙吗
ershihaidao 2012-10-17
  • 打赏
  • 举报
回复
方案一:不存在的分组在结果中不出现
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;
forgetsam 2012-10-17
  • 打赏
  • 举报
回复
聚合source,聚合dest,把两个结果集full Join
xiaobn_cn 2012-10-17
  • 打赏
  • 举报
回复
有两种解决方案,这个取决于你的数据中不存在的分组(例如: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;

onejune4450 2012-10-17
  • 打赏
  • 举报
回复
上一贴有问题,没有测试环境,看一下这个行不?
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

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧